发表于: 2021-10-10 22:55:42
1 987
一,今天完成的事情
任务七。文件上传。
文件上传和下载是常用的功能。文件上传,文件下载与文件在不同的云服务器之间传送非常相关。
1,先用腾讯云。腾讯云自己测试。还是再整合的思路。一定要参考腾讯云的对象存储。
引入两个依赖
<!-- Tencent cloud -->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.87</version>
</dependency>
<!--Tencent COS-->
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.24</version>
图片一般不会超过20m,不用腾讯云的高级 API 接口。
在前端页面的时候,有这么一句代码
<form action="${path}/u/upload/image" method="post" enctype="multipart/form-data">
前端传入的就是MultipartFile格式。
MultipartFile是SpringMVC提供简化上传操作的工具类。在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据,文件是以二进制流传递到后端的,然后需要我们自己转换为File类。使用了MultipartFile工具类之后,我们对文件上传的操作就简便许多了。
multipartFile.transferTo(file) 方法能把MultipartFile 转换为File。腾讯云给的操作,一般是操作file,把本地传到云上。
2,如果是阿里云的对象存储服务(Object Storage Service,简称 OSS)能直接使用MultipartFile。为了使用OSS必须添加aliyun-sdk-oss依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
阿里云OSS提供上传(基础上传,表单上传,追加上传,分片上传,断点上传,上传进度,上传回调) 下载(下载到本地,流式下载,范围下载,断点续传下载,限定条件下载)文件管理等服务。先不展开,我一般是有印象,需要用的时候去用。
阿里云主动给我推送的快速入门,https://help.aliyun.com/learn/learningpath/oss.html?&msctype=sms&mscareaid=cn&mscsiteid=cn&mscmsgid=5600121100700730134&&spm=a2c4i.21138294.zh-cnc.1&&short_name=f1.oIm4i&app=chrome 。第一篇就是上传下载分享,也很基本了。里面特意提到了阿里云建立Bucket。
存储类型:标准类型(Standard),成本更低、存储期限更长 的低频访问类型(Infrequent Access)和归档类型(Archive)。
可以选用可以看到的界面上传文件
参考阿里云的使用说明,特别是下面四个是什么需要清楚。
AccessKeyId
AccessKeySecret
Endpoint
BucketName
3,登录模块
还是需要InterceptUtil,里面使用
JWTUtil
CookieUtil
设置/u/开头的要登录使用。
登录模块和注册模块,都使用selectUserName,一定要看user是否已经存在。
如果登录,需要用户名存在。
如果注册,需要保证用户名,电话,email都不存在。所以逻辑不能错。
Dao文件利用or语句,把3个可能的用户名找出来。
<select id="selectUserName" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
where username = #{username,jdbcType=VARCHAR} or
email=#{username,jdbcType=VARCHAR} or cellphone=#{username,jdbcType=VARCHAR}
</select>
查询的语句适合使用Redis缓存。
如果在以下语句加上缓存逻辑,会很自然把Redis 使用的key设置成传入变量name。
@Override
public User selectUserName(String name){
return userDao.selectUserName( name );
}
但是在我之前的逻辑中,任务七的重头戏email注册和手机注册,使用email和手机,分别在自己的注册逻辑里存储了key是email和手机的验证码。所以如果刚刚注册成功5分钟内(我设置验证码有效期是5分钟),如果用户在发送验证码5分钟内登录,
selectUserName(String name)
中如果用name直接作为Redis缓存中的key,报错。其它和这个函数有关的内容也会报错,还有登录后,再用相同的用户名尝试注册。
可以采用检测到客户登录后,访问注册页面能直接跳转到首页等其它页面 的方式解决。
但是最好是防止使用相同key。比如在Redis中的key,采用 name+字符串 的形式,比如 name+userServiceImp。
成功登陆后
能成功拦截已经注册的注册
二,今天问题
小心不同逻辑中,使用相同名称的Key。
三,今天的收获
充分理解代码逻辑,多测试,最终获得正确代码。
检测到客户登录后,访问注册页面能直接跳转到首页等其它页面。
避免不同逻辑使用相同key,避免互相侵入。
四,明天的计划
任务七
评论