引入maven

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-lang3</artifactId>
  4. </dependency>
  5. <!--阿里云oss-->
  6.  
  7. <dependency>
  8. <groupId>com.aliyun.oss</groupId>
  9. <artifactId>aliyun-sdk-oss</artifactId>
  10. <version>2.8.2</version>
  11. </dependency>

阿里云oss上传工具类

AliOssCloudUtil.java

  1. package com.test.cms.aliyunoss;
  2.  
  3. import com.aliyun.oss.OSSClient;
  4. import com.aliyun.oss.model.*;
  5. import org.apache.commons.logging.Log;
  6. import org.apache.commons.logging.LogFactory;
  7.  
  8. import java.io.*;
  9.  
  10. /**
  11. * 阿里云 OSS文件类
  12. */
  13. public class AliOssCloudUtil {
  14. Log log = LogFactory.getLog(AliOssCloudUtil.class);
  15. private String endpoint = "oss-cn-hangzhou.aliyuncs.com";

    //阿里云的accessKeyId
  16. private String accessKeyId = "LTAI4GBP";

  17.   //阿里云的accessKeySecret
      private String accessKeySecret = "mwpBLG";
  18.  
  19. //空间
  20. private String bucketName = "js";
  21.  
  22. //文件存储目录
  23. private String filedir = "val/";
  24.  
  25. private OSSClient ossClient;
  26.  
  27. public AliOssCloudUtil() {
  28. ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  29. }
  30.  
  31. public String getFiledir() {
  32. return this.filedir;
  33. }
  34.  
  35. //自定义上传文件夹
  36. public AliOssCloudUtil(String filedir) {
  37. this.filedir = filedir;
  38. ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  39. }
  40.  
  41. /**
  42. * 初始化
  43. */
  44. public void init() {
  45. ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  46. }
  47.  
  48. /**
  49. * 销毁
  50. */
  51. public void destory() {
  52. ossClient.shutdown();
  53. }
  54.  
  55. /**
  56. * 上传到OSS服务器
  57. *
  58. * @param instream 文件流
  59. * @param fileName 文件名称 包括后缀名
  60. * @return 出错返回"" ,唯一MD5数字签名
  61. */
  62. public String uploadFile2OSS(InputStream instream, String fileName) {
  63. String ret = "";
  64. // 判断bucket是否已经存在,不存在进行创建
  65. if (!doesBucketExist()) {
  66. createBucket();
  67. }
  68. try {
  69. //创建上传Object的Metadata
  70. ObjectMetadata objectMetadata = new ObjectMetadata();
  71. objectMetadata.setContentLength(instream.available());
  72. objectMetadata.setCacheControl("no-cache");
  73. objectMetadata.setHeader("Pragma", "no-cache");
  74. objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
  75. objectMetadata.setContentDisposition("inline;filename=" + fileName);
  76.  
  77. // 指定上传文件操作时是否覆盖同名Object。
  78. // 不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
  79. // 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
  80. // 指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。
  81. objectMetadata.setHeader("x-oss-forbid-overwrite", "false");
  82.  
  83. String objectName = filedir + fileName;
  84.  
  85. //上传文件
  86. ossClient.putObject(bucketName, objectName, instream, objectMetadata);
  87. // 封装 url 路径
  88. String url = "http://" + bucketName + "." + endpoint + "/" + objectName;
  89. System.out.println(objectName);
  90. ret = url;
  91. } catch (IOException e) {
  92. log.error(e.getMessage(), e);
  93. } finally {
  94. ossClient.shutdown();
  95. try {
  96. if (instream != null) {
  97. instream.close();
  98. }
  99. } catch (IOException e) {
  100. e.printStackTrace();
  101. }
  102. }
  103. return ret;
  104. }
  105.  
  106. /**
  107. * 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS,
  108. * 如果为true则忽略302重定向或镜像;如果为false,则考虑302重定向或镜像。
  109. * yourObjectName 表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
  110. *
  111. * @return 存在返回true
  112. */
  113. public boolean doesObjectExist(String objectName) {
  114. boolean exists = ossClient.doesObjectExist(bucketName, filedir + objectName);
  115. return exists;
  116. }
  117.  
  118. /**
  119. * 判断Bucket是否存在
  120. *
  121. * @return 存在返回true
  122. */
  123. public boolean doesBucketExist() {
  124. boolean exists = ossClient.doesBucketExist(bucketName);
  125. return exists;
  126. }
  127.  
  128. /**
  129. * 创建Bucket
  130. */
  131. public void createBucket() {
  132. CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
  133. // 设置bucket权限为公共读,默认是私有读写
  134. createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
  135. // 设置bucket存储类型为低频访问类型,默认是标准类型
  136. createBucketRequest.setStorageClass(StorageClass.IA);
  137. boolean exists = ossClient.doesBucketExist(bucketName);
  138. if (!exists) {
  139. try {
  140. ossClient.createBucket(createBucketRequest);
  141. // 关闭client
  142. ossClient.shutdown();
  143. } catch (Exception e) {
  144. log.error(e.getMessage());
  145. }
  146. }
  147. }
  148.  
  149. /**
  150. * Description: 判断OSS服务文件上传时文件的contentType
  151. *
  152. * @param FilenameExtension 文件后缀
  153. * @return String
  154. */
  155. public static String getcontentType(String FilenameExtension) {
  156. if ("bmp".equalsIgnoreCase(FilenameExtension)) {
  157. return "image/bmp";
  158. }
  159. if ("gif".equalsIgnoreCase(FilenameExtension)) {
  160. return "image/gif";
  161. }
  162. if ("jpeg".equalsIgnoreCase(FilenameExtension) ||
  163. "jpg".equalsIgnoreCase(FilenameExtension) ||
  164. "png".equalsIgnoreCase(FilenameExtension)) {
  165. return "image/jpeg";
  166. }
  167. if ("html".equalsIgnoreCase(FilenameExtension)) {
  168. return "text/html";
  169. }
  170. if ("txt".equalsIgnoreCase(FilenameExtension)) {
  171. return "text/plain";
  172. }
  173. if ("vsd".equalsIgnoreCase(FilenameExtension)) {
  174. return "application/vnd.visio";
  175. }
  176. if ("pptx".equalsIgnoreCase(FilenameExtension) ||
  177. "ppt".equalsIgnoreCase(FilenameExtension)) {
  178. return "application/vnd.ms-powerpoint";
  179. }
  180. if ("docx".equalsIgnoreCase(FilenameExtension) ||
  181. "doc".equalsIgnoreCase(FilenameExtension)) {
  182. return "application/msword";
  183. }
  184. if ("xml".equalsIgnoreCase(FilenameExtension)) {
  185. return "text/xml";
  186. }
  187. return "image/jpeg";
  188. }
  189.  
  190. /**
  191. * @param fileName
  192. * @return
  193. * @Title: getInputStreamByFileUrl
  194. * @Description: 根据文件路径获取InputStream流
  195. * @return: InputStream
  196. */
  197. public InputStream getInputStreamByFileUrl(String fileName) {
  198. // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
  199. OSSObject ossObject = ossClient.getObject(bucketName, fileName);
  200. return ossObject.getObjectContent();
  201. }
  202. }

控制器类(调用类)

FileUploadController.java

  1. package com.test.cms.controller;
  2.  
  3. import com.test.cms.aliyunoss.AliOssCloudUtil;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.multipart.MultipartFile;
  9.  
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.io.InputStream;
  13. import java.io.OutputStream;
  14. import java.net.URLEncoder;
  15. import java.util.UUID;
  16.  
  17. @RestController
  18. public class FileUploadController {
  19.  
  20. /**
  21. * 文件上传
  22. * @param file
  23. * @return
  24. */
  25. @PostMapping("/file/upload")
  26. public String upload(@RequestParam("file") MultipartFile file) {
  27. String filename = file.getResource().getFilename();
  28. //这里文件名用了uuid 防止重复,可以根据自己的需要来写
  29. String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length());
  30. name = name.replace("-", "");
  31. InputStream inputStream = null;
  32. try {
  33. inputStream = file.getInputStream();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. System.out.println("上传失败");
  37. }
  38. AliOssCloudUtil util = new AliOssCloudUtil();
  39. //上传成功返回完整路径的url
  40. String url = util.uploadFile2OSS(inputStream, name);
  41. return url;
  42. }
  43.  
  44. /**
  45. * 判断文件是否存在
  46. * @param fileName 储存的文件名
  47. * @return
  48. */
  49. @GetMapping("/file/exists")
  50. public Boolean exists(String fileName) {
  51. AliOssCloudUtil util = new AliOssCloudUtil();
  52. Boolean bool = util.doesObjectExist(fileName);
  53. return bool;
  54. }
  55.  
  56. /**
  57. * 下载oss对应文件
  58. * @param fileName 储存的文件名
  59. * @return
  60. */
  61. @PostMapping("/file/downLoad")
  62. public void downloadFile(String fileName, HttpServletResponse response) {
  63. try {
  64. AliOssCloudUtil ossClientUtil = new AliOssCloudUtil();
  65. InputStream is = ossClientUtil.getInputStreamByFileUrl(ossClientUtil.getFiledir() + fileName);
  66. // 配置文件下载
  67. response.setHeader("content-type", "application/octet-stream");
  68. response.setContentType("application/octet-stream");
  69. // 下载文件能正常显示中文
  70. response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
  71. OutputStream os = response.getOutputStream();
  72. byte[] b = new byte[1024];
  73. int len = -1;
  74. while ((len = is.read(b)) != -1) {
  75. os.write(b, 0, len);
  76. }
  77. is.close();
  78. os.close();
  79. } catch (Exception e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. }

JAVA整合阿里云OSS实现文件上传功能的更多相关文章

  1. 阿里云 oss 小文件上传进度显示

    对阿里云OSS上传小文件时的进度,想过两个方法:一是.通过多线程监測Inputstream剩余的字节数来计算,可是由于Inputstream在两个线程中共用,假设上传线程将Inputstream关闭, ...

  2. 阿里云OSS Multipart Upload上传实例

    原来是用的PutObject()方式上传文件的,但是当文件比较大的时候,总是报一个对方强制关闭连接导致上传失败.PS:公司的网比较渣,10MB的文件都传不上去,搜了下,说使用Multipart Upl ...

  3. 阿里云oss,简单上传

    描述:oss比较方便,省去了自己搭建文件服务器的时间,价格比较便宜,下面是java基于oss的简单上传代码 a.添加maven依赖 <dependency> <groupId> ...

  4. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...

  5. 在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现Web端直传,服务端签名直传并设置上传回调的实现流程

    在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现本地文件上传流程 by shuijingwan · 2016/01/13 1.SDK安装 github ...

  6. Thinkphp整合阿里云OSS图片上传实例

    Thinkphp3.2整合阿里云OSS图片上传实例,图片上传至OSS可减少服务器压力,节省宽带,安全又稳定,阿里云OSS对于做负载均衡非常方便,不用传到各个服务器了 首先引入阿里云OSS类库 < ...

  7. springboot整合OSS实现文件上传

    OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.OSS可用于图片.音视频.日志等海量文件的存储.各种终端 ...

  8. 整合阿里云OSS

    整合阿里云OSS 一.对象存储OSS 为了解决海量数据存储与弹性扩容,采用云存储的解决方案- 阿里云OSS. 1.开通"对象存储OSS"服务 (1)申请阿里云账号 (2)实名认证 ...

  9. Java使用阿里云OSS对象存储上传图片

    原 Java使用阿里云OSS对象存储上传图片 2017年03月27日 10:47:28 陌上桑花开花 阅读数 26804更多 分类专栏: 工作案例总结 版权声明:本文为博主原创文章,遵循CC 4.0 ...

随机推荐

  1. CF1539F Strange Array

    这玩意为啥是紫. 考虑对每个小于\(x\)的数值设为1,大于\(x\)的数值设为-1. 那么对于答案要求的就是绝对值最大的连续段. 线段树是很显然的. 考虑我们不能对每个数都进行一遍重构,这样就退化到 ...

  2. 洛谷 P4272 - [CTSC2009]序列变换(堆)

    洛谷题面传送门 u1s1 在我完成这篇题解之前,全网总共两篇题解,一篇使用的平衡树,一篇使用的就是这篇题解讲解的这个做法,但特判掉了一个点,把特判去掉在 BZOJ 上会 WA 一个点. 两篇题解都异常 ...

  3. 洛谷 P5406 - [THUPC2019]找树(FWT+矩阵树定理)

    题面传送门 首先看到这道题你必须要有一个很清楚的认识:这题新定义的 \(\oplus\) 符号非常奇怪,也没有什么性质而言,因此无法通过解决最优化问题的思路来解决这个问题,只好按照计数题的思路来解决, ...

  4. Codeforces 585E - Present for Vitalik the Philatelist(简单莫反+狄利克雷前缀和)

    Codeforces 题目传送门 & 洛谷题目传送门 一道不算太难的 D1E 罢--虽然我不会做/kk u1s1 似乎这场 Div1 挺水的?F 就是个 AC 自动机板子还被评到了 3k2-- ...

  5. mysql-计算排名

    mysql计算排名,获取行号rowno 学生成绩表数据 SELECT * FROM table_score ORDER BY score DESC; 获取某个学生成绩排名并计算该学生和上一名学生成绩差 ...

  6. Go 性能提升tips--边界检查

    1. 什么是边界检查? 边界检查,英文名 Bounds Check Elimination,简称为 BCE.它是 Go 语言中防止数组.切片越界而导致内存不安全的检查手段.如果检查下标已经越界了,就会 ...

  7. day07 MySQL索引事务

    day07 MySQL索引事务 昨日内容回顾 pymysql模块 # 链接数据库都是使用这个模块的 # 创建链接 import pymysql conn = pymysql.connect( host ...

  8. vue开发多页面应用 - hash模式和history模式

    我们知道vue可以快速开发web单页应用,而且官方为我们提供了自己的应用脚手架vue-cli,我们只需要下载脚手架,安装依赖后就可以启动vue应用雏形. 这得益与webpack的依赖追踪,各种资源后缀 ...

  9. ComponentScan注解的使用

    在项目初始化时,会将加@component,@service...相关注解的类添加到spring容器中. 但是项目需要,项目初始化时自动过滤某包下面的类,不将其添加到容器中. 有两种实现方案, 1.如 ...

  10. Linux学习 - 文件系统常用命令

    一.文件系统查看命令df df [选项] [挂载点] -a 查看所有文件系统信息,包括特殊文件系统 -h 使用习惯单位显示容量 -T 显示文件系统类型 -m 以MB为单位显示容量 -k 以KB为单位显 ...