• 做一个Springboot文件上传-阿里云


    概述

            这个模块是用来上传头像以及文章封面的,图片的值是一个地址字符串,一般存放在本地或阿里云服务中

    1、本地文件上传

            我们将文件保存在一个本地的文件夹下,由于可能两个人上传不同图片但是却同名的图片,那么就会一个人的图片就会覆盖住另一个人的图片。因此我们需要使用UUID来保证我们的图片名字不重复。

    tomcat默认的最大文件上传大小为1mb,超过就会报错,我们可以更改一下配置

    1. spring:
    2. servlet:
    3. multipart.max-file-size: 50MB
    4. multipart.max-request-size: 50MB
    5. server:
    6. max-http-form-post-size: -1

    代码实现

    Controller

    1. @RestController
    2. public class FileUploadController {
    3. @PostMapping("/upload")
    4. public Result upload(MultipartFile file) throws IOException {
    5. //把文件的内容
    6. String originalFilename = file.getOriginalFilename();
    7. //保证文件的名字是唯一的,后缀加上.png
    8. String fileName = UUID.randomUUID().toString() +
    9. originalFilename.substring(originalFilename.lastIndexOf("."));
    10. file.transferTo(new File("D:\\JAVA_project\\big-event\\src\\main\\resources\\static\\files\\" +
    11. fileName));
    12. return Result.success("url访问地址...");
    13. }
    14. }

    测试

     

    上传同一个文件三次且没有覆盖


    2、阿里云OSS

    非官方解释:互联网上的一些远程服务器,可供你使用。

    阿里云是阿里巴巴集团下全球领先的云计算公司,也是国内最大的云服务提供商。

    我们选择阿里云OSS云服务器,第一次使用赠送三个月20G的试用

    我们直接将图片或文件直接存储在阿里云oss上即可

    创建一个bucket 

    进入bucket

    点击AccessKey管理

    创建一个AccessKey,这个就相当于账号和密码了,不要泄露

    使用方法

    引入依赖

    1. <dependency>
    2. <groupId>com.aliyun.ossgroupId>
    3. <artifactId>aliyun-sdk-ossartifactId>
    4. <version>3.15.1version>
    5. dependency>

    如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖。添加jaxb相关依赖示例代码如下 

    1. <dependency>
    2. <groupId>javax.xml.bindgroupId>
    3. <artifactId>jaxb-apiartifactId>
    4. <version>2.3.1version>
    5. dependency>
    6. <dependency>
    7. <groupId>javax.activationgroupId>
    8. <artifactId>activationartifactId>
    9. <version>1.1.1version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.glassfish.jaxbgroupId>
    13. <artifactId>jaxb-runtimeartifactId>
    14. <version>2.3.3version>
    15. dependency>

    阿里云中提供了现成的解释文档供我们使用,我们直接将其中的案例demo拿过来改成我们自己的工具类

    1. package com.wal.bigevent.util;
    2. import com.aliyun.oss.ClientException;
    3. import com.aliyun.oss.OSS;
    4. import com.aliyun.oss.OSSClientBuilder;
    5. import com.aliyun.oss.OSSException;
    6. import com.aliyun.oss.model.PutObjectRequest;
    7. import com.aliyun.oss.model.PutObjectResult;
    8. import java.io.File;
    9. import java.io.InputStream;
    10. public class AliOssUtil {
    11. // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    12. private static final String Endpoint = "https://oss-cn-beijing.aliyuncs.com";
    13. // 填写Bucket名称,例如examplebucket。
    14. private static final String bucketName = "big-event-wal";
    15. private static final String AccessKeyId = "LTAI5tCLBwaVPB2MA3Lhu2vo";
    16. private static final String AccessKeySecret = "q0j64AWJkJG2LMH8oDycfomen8saV1";
    17. public static String uploadFile(String objectName, InputStream in) throws Exception {
    18. // EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
    19. // 创建OSSClient实例。
    20. OSS ossClient = new OSSClientBuilder().build(Endpoint,AccessKeyId,AccessKeySecret);
    21. String url = "";
    22. try {
    23. // 填写字符串。
    24. String content = "Hello OSS,你好世界";
    25. // 创建PutObjectRequest对象。
    26. PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,objectName ,in);
    27. // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
    28. // ObjectMetadata metadata = new ObjectMetadata();
    29. // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
    30. // metadata.setObjectAcl(CannedAccessControlList.Private);
    31. // putObjectRequest.setMetadata(metadata);
    32. // 上传字符串。
    33. PutObjectResult result = ossClient.putObject(putObjectRequest);
    34. url = "https://" + bucketName + "." + Endpoint.substring(Endpoint.lastIndexOf("/") + 1)+ "/" +objectName;
    35. } catch (OSSException oe) {
    36. System.out.println("Caught an OSSException, which means your request made it to OSS, "
    37. + "but was rejected with an error response for some reason.");
    38. System.out.println("Error Message:" + oe.getErrorMessage());
    39. System.out.println("Error Code:" + oe.getErrorCode());
    40. System.out.println("Request ID:" + oe.getRequestId());
    41. System.out.println("Host ID:" + oe.getHostId());
    42. } catch (ClientException ce) {
    43. System.out.println("Caught an ClientException, which means the client encountered "
    44. + "a serious internal problem while trying to communicate with OSS, "
    45. + "such as not being able to access the network.");
    46. System.out.println("Error Message:" + ce.getMessage());
    47. } finally {
    48. if (ossClient != null) {
    49. ossClient.shutdown();
    50. }
    51. }
    52. return url;
    53. }
    54. }

    将之前的本地上传的Controller更改

    1. @RestController
    2. public class FileUploadController {
    3. @PostMapping("/upload")
    4. public Result upload(MultipartFile file) throws Exception {
    5. //把文件的内容
    6. String originalFilename = file.getOriginalFilename();
    7. //保证文件的名字是唯一的,后缀加上.png
    8. String fileName = UUID.randomUUID().toString() +
    9. originalFilename.substring(originalFilename.lastIndexOf("."));
    10. // file.transferTo(new File("D:\\JAVA_project\\big-event\\src\\main\\resources\\static\\files\\" +
    11. // fileName));
    12. String url = AliOssUtil.uploadFile(fileName, file.getInputStream());
    13. return Result.success(url);
    14. }
    15. }

    测试

     

  • 相关阅读:
    Java进阶篇--并发容器之BlockingQueue
    uni-app解决表格uni-table样式问题
    01|导读:背景知识对于理解文章究竟有多重要?
    【人工智能Ⅰ】8-回归 & 降维
    Bean生命周期
    深入理解联邦学习——纵向联邦学习
    Kubernetes Service对象
    快消品行业供应商SRM云协同系统架构大数据战略,让平台数据价值最大化
    算法之滑动窗口
    element-ui在项目当中的引入以及按需引入使用
  • 原文地址:https://blog.csdn.net/m0_56308072/article/details/134372893