• 22-07-05 七牛云存储图片、用户头像上传


    上传的文件保存到哪里好

    方式1.当前项目所在的服务器。但是不太好,有很多的问题

    问题一:会占用tomcat的硬盘空间,影响tomcat的运行效率;
    问题二:用户上传的文件容易丢失(clean,会把target删除)
    问题三:在集群环境下会产生数据的不一致。(上传头像上传的只是某一台服务器)

    方式2.上传到专门的文件存储服务器,tomcat就是应用服务器,来部署应用的

    2.1FASTDFS、HDFS 要自己搭建
    2.2 购买第三方云存储:
    阿里云、百度云、腾讯云、七牛云(视觉方面做的极致,视频、图片)


    使用七牛云提供的对象存储服务来存储图片

    注册并登录成功以后:

    第一步:创建对象存储空间

    在资源管理里点击新建存储空间

     此时弹出页面:填好信息

     可以创建多个存储空间,各个存储空间是相互独立的

     第二步:查看存储空间信息

    存储空间创建后,会在左侧的存储空间列表菜单中展示创建的存储空间名称,点击存储空间名称可以查看当前存储空间的相关信息

    切换tab页到-文件管理 


    七牛云开发者中心

    可以通过七牛云提供的开发者中心学习如何操作七牛云服务,地址:七牛开发者中心

    对象存储 - 七牛开发者中心   点击对象存储,跳转到对象存储开发页面

    写一个入门案例:
    第一步:导入jar包:

    1. <!--七牛云服务平台,第三方服务(图片上传)-->
    2. <dependency>
    3. <groupId>com.qiniu</groupId>
    4. <artifactId>qiniu-java-sdk</artifactId>
    5. </dependency>

    第二步:鉴权

    我们的AK和SK在哪呢?

    一会在Java代码里会用到这一对AK、SK的,到时候来这里复制就好了 


    文件上传:

    在官网里是有案例的,我这里就是仿照那里写的测试代码

    1. public void testUpload(){
    2. //构造一个带指定 Zone 对象的配置类
    3. Configuration cfg = new Configuration(Zone.zone2());
    4. //创建一个文件上传的管理器对象
    5. UploadManager uploadManager = new UploadManager(cfg);
    6. //...生成上传凭证,然后准备上传
    7. //你自己的AccessKey
    8. String accessKey = "5awGQ0oY-NJUOECgxTnOQOHOG66W8wCvBJChUqmM";
    9. //你自己的SecretKey
    10. String secretKey = "pz_xQZbTrhFErQcGaeCLn-tkq_1F5uXQDCBo_2tc";
    11. //你自己的空间的名字
    12. String bucket = "shfxa0328-xym";
    13. //如果是Windows情况下,格式是 D:\\qiniu\\test.png
    14. String localFilePath = "D:/qiniu/test.jpg";
    15. ///key表示文件上传到七牛云中的名字,默认不指定key的情况下,以文件内容的hash值作为文件名
    16. String key = null;
    17. //鉴权
    18. Auth auth = Auth.create(accessKey, secretKey);
    19. //创建一个文件上传标示token
    20. String upToken = auth.uploadToken(bucket);
    21. try {
    22. //文件上传
    23. Response response = uploadManager.put(localFilePath, key, upToken);
    24. //解析上传成功的结果
    25. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    26. System.out.println(putRet.key);
    27. System.out.println(putRet.hash);
    28. } catch (QiniuException ex) {
    29. Response r = ex.response;
    30. System.err.println(r.toString());
    31. try {
    32. System.err.println(r.bodyString());
    33. } catch (QiniuException ex2) {
    34. //ignore
    35. }
    36. }
    37. }

    运行之前先施法,配置一下这里

    运行,控制台打印如下

    在七牛云上可以看到我们上传图片成功了,且文件名和我们控制台打印的结果是一样的

      点击右边的文件详情,就可以看到这个文件的据图信息了


    文件的删除

    1. public void testDelete(){
    2. //构造一个带指定 Zone 对象的配置类
    3. Configuration cfg = new Configuration(Zone.zone2());
    4. //你自己的AccessKey
    5. String accessKey = "5awGQ0oY-NJUOECgxTnOQOHOG66W8wCvBJChUqmM";
    6. //你自己的SecretKey
    7. String secretKey = "pz_xQZbTrhFErQcGaeCLn-tkq_1F5uXQDCBo_2tc";
    8. //你自己的空间的名字
    9. String bucket = "shfxa0328-xym";
    10. //要删除的那个文件的名称
    11. String key = "FnATf109bsayb0tYiZKgoHn96lQT";
    12. Auth auth = Auth.create(accessKey, secretKey);
    13. BucketManager bucketManager = new BucketManager(auth, cfg);
    14. try {
    15. bucketManager.delete(bucket, key);
    16. } catch (QiniuException ex) {
    17. //如果遇到异常,说明删除失败
    18. System.err.println(ex.code());
    19. System.err.println(ex.response.toString());
    20. }
    21. }

    检查七牛云,文件确实被删除了


    封装工具类QiniuUtils

    这个工具类有3处是需要修改的

    1. public class QiniuUtils {
    2. private static String accessKey = "5awGQ0oY-NJUOECgxTnOQOHOG66W8wCvBJChUqmM";
    3. private static String secretKey = "pz_xQZbTrhFErQcGaeCLn-tkq_1F5uXQDCBo_2tc";
    4. private static String bucket = "shfxa0328-xym";
    5. public static void upload2Qiniu(String filePath,String fileName){
    6. //构造一个带指定Zone对象的配置类
    7. Configuration cfg = new Configuration(Zone.zone2());
    8. UploadManager uploadManager = new UploadManager(cfg);
    9. Auth auth = Auth.create(accessKey, secretKey);
    10. String upToken = auth.uploadToken(bucket);
    11. try {
    12. Response response = uploadManager.put(filePath, fileName, upToken);
    13. //解析上传成功的结果
    14. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    15. } catch (QiniuException ex) {
    16. Response r = ex.response;
    17. try {
    18. System.err.println(r.bodyString());
    19. } catch (QiniuException ex2) {
    20. //ignore
    21. }
    22. }
    23. }
    24. //上传文件
    25. public static void upload2Qiniu(byte[] bytes, String fileName){
    26. //构造一个带指定Zone对象的配置类
    27. Configuration cfg = new Configuration(Zone.zone2());
    28. //...其他参数参考类注释
    29. UploadManager uploadManager = new UploadManager(cfg);
    30. //默认不指定key的情况下,以文件内容的hash值作为文件名
    31. String key = fileName;
    32. Auth auth = Auth.create(accessKey, secretKey);
    33. String upToken = auth.uploadToken(bucket);
    34. try {
    35. Response response = uploadManager.put(bytes, key, upToken);
    36. //解析上传成功的结果
    37. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    38. System.out.println(putRet.key);
    39. System.out.println(putRet.hash);
    40. } catch (QiniuException ex) {
    41. Response r = ex.response;
    42. System.err.println(r.toString());
    43. try {
    44. System.err.println(r.bodyString());
    45. } catch (QiniuException ex2) {
    46. //ignore
    47. }
    48. }
    49. }
    50. //删除文件
    51. public static void deleteFileFromQiniu(String fileName){
    52. //构造一个带指定Zone对象的配置类
    53. Configuration cfg = new Configuration(Zone.zone2());
    54. String key = fileName;
    55. Auth auth = Auth.create(accessKey, secretKey);
    56. BucketManager bucketManager = new BucketManager(auth, cfg);
    57. try {
    58. bucketManager.delete(bucket, key);
    59. } catch (QiniuException ex) {
    60. //如果遇到异常,说明删除失败
    61. System.err.println(ex.code());
    62. System.err.println(ex.response.toString());
    63. }
    64. }
    65. public static String getUrl(String uuidName) {
    66. return "http://rejg8ksr8.hn-bkt.clouddn.com/" + uuidName;
    67. }
    68. }

    我们实现一个上传头像的功能

    前端页面:

    1. <form id="ec" th:action="@{/admin/upload/{id}(id=${id})}" method="post" enctype="multipart/form-data" class="form-horizontal">
    2. <div class="form-group">
    3. <label class="col-sm-2 control-label">上传头像:</label>
    4. <div class="col-sm-10">
    5. <input type="file" name="file" id="file" class="form-control" readonly/>
    6. </div>
    7. </div>
    8. <div class="hr-line-dashed"></div>
    9. <div class="form-group">
    10. <div class="col-sm-4 col-sm-offset-2 text-right">
    11. <button class="btn btn-primary" type="submit">确定</button>
    12. <button class="btn btn-white" type="button" onclick="javascript:opt.closeWin();" value="取消">取消</button>
    13. </div>
    14. </div>

    在页面上效果如下

    选择完头像点击确定就会执行这样一段代码:

    1. @PostMapping("/upload/{id}")
    2. public String upload(@PathVariable("id") Long id, @RequestParam("file") MultipartFile multipartFile, Model model) throws IOException {
    3. //id是用户的id
    4. //1. 将图片上传到七牛云
    5. //生成一个唯一的文件名
    6. String originalFilename = multipartFile.getOriginalFilename();
    7. String uuidName = FileUtil.getUUIDName(originalFilename);
    8. QiniuUtils.upload2Qiniu(multipartFile.getBytes(),uuidName);
    9. //2. 将图片信息保存到数据库
    10. //2.1 获取图片的url
    11. String headUrl = QiniuUtils.getUrl(uuidName);
    12. //2.2 封装信息到Admin
    13. Admin admin = new Admin();
    14. admin.setId(id);
    15. admin.setHeadUrl(headUrl);
    16. //2.3 更新admin
    17. adminService.update(admin);
    18. //3. 显示成功页面
    19. return successPage(model,"上传头像成功");
    20. }

    在数据库的acl_admin表中head_url字段确实变更了

    去七牛云里,也是可以看到我们上传成功的头像的

     要注意的点:一定要在spring-mvc的配置文件中开启文件上传解析器

    1. <!--文件解析器-->
    2. <bean id="multipartResolver"
    3. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    4. <!-- 设定文件上传的最大值为100MB,100*1024*1024 -->
    5. <property name="maxUploadSize" value="104857600" />
    6. <!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 -->
    7. <property name="maxInMemorySize" value="4096" />
    8. <!-- 设定默认编码 -->
    9. <property name="defaultEncoding" value="UTF-8"/>
    10. </bean>
  • 相关阅读:
    MySQL数据库读取外部文件
    Open CASCADE学习|选取模型的点、线和面
    BI-SQL丨游标
    oracle 序列的属性有哪些
    GO编译时避免引入外部动态库的解决方法
    SAS学习1(总体介绍以及一些程序例子)
    戴尔服务器安装Debian11过程
    图解LeetCode——667. 优美的排列 II(难度:中等)
    java计算机毕业设计vue基层社区管理服务网源码+mysql数据库+系统+lw文档+部署
    Java#15(集合)
  • 原文地址:https://blog.csdn.net/m0_56799642/article/details/125619715