首页 > 其他分享 >文件上传与下载完整版

文件上传与下载完整版

时间:2024-01-29 17:44:07浏览次数:18  
标签:String url oss bucket file path 完整版 上传 下载

<!--OSS文件服务-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

再配置一下文件上传大小限制

再 application.yml 中添加如下配置,限制单个文件最大 100M 、文件上传总大小 200M。

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 200MB

实现功能有:

  1. 单个文件上传
  2. 多个文件上传
  3. 单个文件删除
  4. 多个文件删除
  1 @Slf4j
  2 @Component
  3 @AllArgsConstructor
  4 public class OssTemplate {
  5 
  6     // 我自己抽的统一文件前缀,communication-resource
  7     private final String prefix = "oss.file.prefix";
  8     // 你的 bucket,j3-communication
  9     private final String bucket = "oss.file.bucket";
 10     // 你的 bucket 外网访问域名,https://oss-cn-guangzhou.aliyuncs.com
 11     private final String endpoint = "oss.file.endpoint";
 12     // 拼接返回url要用的,bucket + 域名 例如: j3-communication.oss-cn-guangzhou.aliyuncs.com
 13     private final String bucketHost = "oss.file.bucketHost";
 14     // 这两个就没啥好说的了
 15     private final String accessKeyId = "oss.file.accessKeyId";
 16     private final String accessKeySecret = "oss.file.accessKeySecret";
 17     // 生成文件路径用的,根据日期
 18     private final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
 19 
 20     /**
 21      * 单个文件上传
 22      * @param file
 23      * @return
 24      */
 25     public String upload(MultipartFile file) {
 26         // 路径拼接
 27         String dataPath = format.format(new Date());
 28         // 文件名称生成
 29         String uuid = UUID.randomUUID().toString().replace("-", "");
 30         String path = prefix + "/" + dataPath + "/" + uuid + file.getOriginalFilename();
 31         try {
 32             // 上传
 33             ossUpload(bucket, path, file.getInputStream());
 34         } catch (IOException e) {
 35             throw new SysException("文件上传失败!");
 36         }
 37         // 因为 oss 不会返回访问 url 所以我们自己可以拼接一个:
 38         // 协议(https://) + 域名访问地址(j3-communication.oss-cn-guangzhou.aliyuncs.com) + 自己拼接的路径(xxx/xxx/a.jpg)
 39         return "https://" + bucketHost + "/" + path;
 40     }
 41 
 42 
 43     /**
 44      * 多个文件上传
 45      * @param files
 46      * @return
 47      */
 48     public List<String> upload(MultipartFile[] files) {
 49         List<String> usrList = new ArrayList<>(files.length);
 50         for (MultipartFile file : files) {
 51             usrList.add(upload(file));
 52         }
 53         return usrList;
 54     }
 55 
 56 
 57     /**
 58      * 具体上传代码
 59      * @param bucket backet名称
 60      * @param path 路径
 61      * @param inputStream 文件流
 62      * @return
 63      */
 64     private PutObjectResult ossUpload(String bucket, String path, InputStream inputStream) {
 65         OSS ossClient = null;
 66         PutObjectResult putObjectResult = null;
 67         try {
 68             // 创建OSSClient实例。
 69             ossClient = new OSSClientBuilder().build(endpoint
 70                     , accessKeyId
 71                     , accessKeySecret);
 72             // 通过文件流的形式上传文件
 73             putObjectResult = ossClient.putObject(bucket, path, inputStream);
 74         } catch (Exception e) {
 75             //错误处理
 76             log.error("==========ossUpload_error, {}", e);
 77             throw new SysException("文件上传失败!");
 78         } finally {
 79             //资源关闭
 80             assert ossClient != null;
 81             ossClient.shutdown();
 82         }
 83         return putObjectResult;
 84     }
 85 
 86 
 87     /**
 88      * 单个删除
 89      * @param url 文件url
 90      */
 91     public void delete(String url) {
 92         // 处理 url
 93         log.info("============入参:{}", url);
 94         String path = url.substring(("https://" + bucketHost + "/").length());
 95         log.info("============path:{}", path);
 96         ossDelete(bucket, Collections.singletonList(path));
 97     }
 98 
 99     /**
100      * 多个删除
101      * @param urlList
102      */
103     public void delete(List<String> urlList) {
104         List<String> keys = new ArrayList<>(urlList.size());
105         for (String url : urlList) {
106             keys.add(url.substring(("https://" + bucketHost + "/").length()));
107         }
108         ossDelete(bucket, keys);
109     }
110 
111     /**
112      * 具体删除代码
113      * @param bucket backet
114      * @param pathList 文件url列表
115      */
116     private void ossDelete(String bucket, List<String> pathList) {
117         OSS ossClient = null;
118         try {
119             // 创建OSSClient实例。
120             ossClient = new OSSClientBuilder().build(endpoint
121                     , accessKeyId
122                     , accessKeySecret);
123             // ossClient.deleteObject(bucket, path);
124             DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucket);
125             deleteObjectsRequest.setKeys(pathList);
126             ossClient.deleteObjects(deleteObjectsRequest);
127         } catch (Exception e) {
128             //错误处理
129             log.error("==========ossUpload_error, {}", e);
130             throw new SysException("文件删除失败!");
131         } finally {
132             //资源关闭
133             assert ossClient != null;
134             ossClient.shutdown();
135         }
136     }
137 
138 }

2.3 编写 controller 测试

 1 @Slf4j
 2 @AllArgsConstructor
 3 @ResponseResult
 4 @RequestMapping("/test/oss")
 5 public class OssTemplateTest {
 6 
 7     private final OssTemplate ossTemplate;
 8 
 9     @PostMapping("/upload")
10     public String upload(MultipartFile file) {
11         return ossTemplate.upload(file);
12     }
13 
14     @PostMapping("/batch")
15     public List<String> upload(MultipartFile[] files) {
16         return ossTemplate.upload(files);
17     }
18 
19     @GetMapping("/delete")
20     public void delete(@RequestParam(name = "url") String url) {
21         ossTemplate.delete(url);
22     }
23 
24     @PostMapping("/deletes")
25     public void deletes(@RequestBody List<String> urlList) {
26         ossTemplate.delete(urlList);
27     }
28 
29 }

 

标签:String,url,oss,bucket,file,path,完整版,上传,下载
From: https://www.cnblogs.com/liyongliangs/p/17995003

相关文章

  • Nacos 官网重大升级,提供官方发行版下载包,3.0 里程碑版本新特性预告
    作者:袁坤(丹坤)、黄子纯(梓莼)、朱颜(竞竞)、季敏(清铭)、杨翊(席翁)、王晨(望宸)、邢学超(于怀)什么是Nacos以及 nacos.ioNacos/nɑ:kəʊs/是Dynamic Namingand Configuration Service的首字母简称,Nacos开源产品定位是更易于构建云原生应用的动态服务发现、配置管理和......
  • 手把手教你如何下载途途课堂上面已购买的视频课程
    前言:很多同学都想知道途途课堂的视频课程怎么下载,但是途途课堂上面已购买的视频课程是不提供直接下载方式的,所以下面就教大家如何用学无止下载器下载途途课堂上面已购买的视频课程。一、下载器首页输入T,并按回车,提示登录,再输入Y登录对应的途途账号二、此时会有弹窗让你登录,选择......
  • 手把手教你如何下载高途课堂上面已购买的视频课程
    前言:很多同学都想知道高途课堂的视频课程怎么下载,但是高途课堂上面已购买的视频课程是不提供直接下载方式的,所以下面就教大家如何用学无止下载器下载高途课堂上面已购买的视频课程。一、下载器首页输入G,并按回车,提示登录,再输入Y登录对应的高途账号二、此时会有弹窗让你登录,选择......
  • 云打印app怎么下载,云打印app怎么使用?
    随着云技术的飞速发展,现在云打印也已经普及到众多用户之间。很多有打印需求的朋友都需要用到云打印服务,很多小伙伴也在咨询云打印app,那么今天小易就带大家来了解一下,云打印app怎么下载,云打印app怎么使用? 云打印app怎么下载?很多想要使用云打印服务的用户都想下载云打印app,那......
  • Python下载的11种姿势,一种比一种高级!
    今天我们一起学习如何使用不同的Python模块从web下载文件。此外,你将下载常规文件、web页面、AmazonS3和其他资源。 最后,你将学习如何克服可能遇到的各种挑战,例如下载重定向的文件、下载大型文件、完成一个多线程下载以及其他策略。1、使用requests你可以使用requests模块从一个UR......
  • JDK删除及下载
    卸载JDK删除JAVA的安装目录删除JAVA_HOME删除path下关于JAVA的目录命令行窗口java-version安装JDK搜索JDK8,找到下载地址同意协议下载电脑对应版本双击安装JDK记住安装路径D:\Environment\java\jdk1.8\配置环境变量我的电脑-->右键-->属性点击高级系统设置在系......
  • Windows11专业版下载地址
    Windows11专业版是微软公司推出的操作系统,是Windows10的继任者。它拥有全新的界面设计、改进的性能和安全功能,支持Android应用程序运行,并提供更流畅的多任务体验。专业版还包含企业级功能,适用于商业用户,提供更强大的管理和安全性能。微软Windows11官方ISO镜像下载地址:www.mic......
  • 【完整版教程】查看APP崩溃日志
    摘要本文介绍了在Android和iOS双端设备上查看APP崩溃日志的方法,包括使用adb命令获取Android崩溃日志以及通过克魔助手工具查看iOS设备的崩溃日志。同时提供了操作步骤和相关代码案例演示。引言在移动应用开发过程中,经常需要查看APP的崩溃日志以便进行调试和分析。针对Android和......
  • 自定义httpServletRequestWrapper导致上传文件请求参数丢失
    问题背景项目是SpringBoot单体式,在项目中,为了实现调用controller请求的日志记录功能。因此做了以下配置:创建自定义拦截器LogInterceptor;因为需要使用到流获取请求参数,解决流只能读一次问题,所以需要自定义HttpServletRequestWrapper;需要使得自定义HttpServletRequestW......
  • 算法笔记 pdf下载
    《算法笔记》内容包括:C/C++快速入门、入门模拟、算法初步、数学问题、C++标准模板库(STL)、数据结构专题(二章)、搜索专题、图算法专题、动态规划专题、字符串专题、专题扩展。《算法笔记》印有二维码,用来实时更新、补充内容及发布勘误的。《算法笔记》可作为计算机专业研究生入学考......