发表于: 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,避免互相侵入。


四,明天的计划

任务七





返回列表 返回列表
评论

    分享到