JAVA整合阿里云OSS实现文件上传功能
引入maven
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- </dependency>
- <!--阿里云oss-->
- <dependency>
- <groupId>com.aliyun.oss</groupId>
- <artifactId>aliyun-sdk-oss</artifactId>
- <version>2.8.2</version>
- </dependency>
阿里云oss上传工具类
AliOssCloudUtil.java
- package com.test.cms.aliyunoss;
- import com.aliyun.oss.OSSClient;
- import com.aliyun.oss.model.*;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import java.io.*;
- /**
- * 阿里云 OSS文件类
- */
- public class AliOssCloudUtil {
- Log log = LogFactory.getLog(AliOssCloudUtil.class);
- private String endpoint = "oss-cn-hangzhou.aliyuncs.com";
//阿里云的accessKeyId- private String accessKeyId = "LTAI4GBP";
//阿里云的accessKeySecret
private String accessKeySecret = "mwpBLG";- //空间
- private String bucketName = "js";
- //文件存储目录
- private String filedir = "val/";
- private OSSClient ossClient;
- public AliOssCloudUtil() {
- ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
- }
- public String getFiledir() {
- return this.filedir;
- }
- //自定义上传文件夹
- public AliOssCloudUtil(String filedir) {
- this.filedir = filedir;
- ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
- }
- /**
- * 初始化
- */
- public void init() {
- ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
- }
- /**
- * 销毁
- */
- public void destory() {
- ossClient.shutdown();
- }
- /**
- * 上传到OSS服务器
- *
- * @param instream 文件流
- * @param fileName 文件名称 包括后缀名
- * @return 出错返回"" ,唯一MD5数字签名
- */
- public String uploadFile2OSS(InputStream instream, String fileName) {
- String ret = "";
- // 判断bucket是否已经存在,不存在进行创建
- if (!doesBucketExist()) {
- createBucket();
- }
- try {
- //创建上传Object的Metadata
- ObjectMetadata objectMetadata = new ObjectMetadata();
- objectMetadata.setContentLength(instream.available());
- objectMetadata.setCacheControl("no-cache");
- objectMetadata.setHeader("Pragma", "no-cache");
- objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
- objectMetadata.setContentDisposition("inline;filename=" + fileName);
- // 指定上传文件操作时是否覆盖同名Object。
- // 不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
- // 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
- // 指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。
- objectMetadata.setHeader("x-oss-forbid-overwrite", "false");
- String objectName = filedir + fileName;
- //上传文件
- ossClient.putObject(bucketName, objectName, instream, objectMetadata);
- // 封装 url 路径
- String url = "http://" + bucketName + "." + endpoint + "/" + objectName;
- System.out.println(objectName);
- ret = url;
- } catch (IOException e) {
- log.error(e.getMessage(), e);
- } finally {
- ossClient.shutdown();
- try {
- if (instream != null) {
- instream.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return ret;
- }
- /**
- * 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS,
- * 如果为true则忽略302重定向或镜像;如果为false,则考虑302重定向或镜像。
- * yourObjectName 表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
- *
- * @return 存在返回true
- */
- public boolean doesObjectExist(String objectName) {
- boolean exists = ossClient.doesObjectExist(bucketName, filedir + objectName);
- return exists;
- }
- /**
- * 判断Bucket是否存在
- *
- * @return 存在返回true
- */
- public boolean doesBucketExist() {
- boolean exists = ossClient.doesBucketExist(bucketName);
- return exists;
- }
- /**
- * 创建Bucket
- */
- public void createBucket() {
- CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
- // 设置bucket权限为公共读,默认是私有读写
- createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
- // 设置bucket存储类型为低频访问类型,默认是标准类型
- createBucketRequest.setStorageClass(StorageClass.IA);
- boolean exists = ossClient.doesBucketExist(bucketName);
- if (!exists) {
- try {
- ossClient.createBucket(createBucketRequest);
- // 关闭client
- ossClient.shutdown();
- } catch (Exception e) {
- log.error(e.getMessage());
- }
- }
- }
- /**
- * Description: 判断OSS服务文件上传时文件的contentType
- *
- * @param FilenameExtension 文件后缀
- * @return String
- */
- public static String getcontentType(String FilenameExtension) {
- if ("bmp".equalsIgnoreCase(FilenameExtension)) {
- return "image/bmp";
- }
- if ("gif".equalsIgnoreCase(FilenameExtension)) {
- return "image/gif";
- }
- if ("jpeg".equalsIgnoreCase(FilenameExtension) ||
- "jpg".equalsIgnoreCase(FilenameExtension) ||
- "png".equalsIgnoreCase(FilenameExtension)) {
- return "image/jpeg";
- }
- if ("html".equalsIgnoreCase(FilenameExtension)) {
- return "text/html";
- }
- if ("txt".equalsIgnoreCase(FilenameExtension)) {
- return "text/plain";
- }
- if ("vsd".equalsIgnoreCase(FilenameExtension)) {
- return "application/vnd.visio";
- }
- if ("pptx".equalsIgnoreCase(FilenameExtension) ||
- "ppt".equalsIgnoreCase(FilenameExtension)) {
- return "application/vnd.ms-powerpoint";
- }
- if ("docx".equalsIgnoreCase(FilenameExtension) ||
- "doc".equalsIgnoreCase(FilenameExtension)) {
- return "application/msword";
- }
- if ("xml".equalsIgnoreCase(FilenameExtension)) {
- return "text/xml";
- }
- return "image/jpeg";
- }
- /**
- * @param fileName
- * @return
- * @Title: getInputStreamByFileUrl
- * @Description: 根据文件路径获取InputStream流
- * @return: InputStream
- */
- public InputStream getInputStreamByFileUrl(String fileName) {
- // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
- OSSObject ossObject = ossClient.getObject(bucketName, fileName);
- return ossObject.getObjectContent();
- }
- }
控制器类(调用类)
FileUploadController.java
- package com.test.cms.controller;
- import com.test.cms.aliyunoss.AliOssCloudUtil;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.multipart.MultipartFile;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.URLEncoder;
- import java.util.UUID;
- @RestController
- public class FileUploadController {
- /**
- * 文件上传
- * @param file
- * @return
- */
- @PostMapping("/file/upload")
- public String upload(@RequestParam("file") MultipartFile file) {
- String filename = file.getResource().getFilename();
- //这里文件名用了uuid 防止重复,可以根据自己的需要来写
- String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length());
- name = name.replace("-", "");
- InputStream inputStream = null;
- try {
- inputStream = file.getInputStream();
- } catch (IOException e) {
- e.printStackTrace();
- System.out.println("上传失败");
- }
- AliOssCloudUtil util = new AliOssCloudUtil();
- //上传成功返回完整路径的url
- String url = util.uploadFile2OSS(inputStream, name);
- return url;
- }
- /**
- * 判断文件是否存在
- * @param fileName 储存的文件名
- * @return
- */
- @GetMapping("/file/exists")
- public Boolean exists(String fileName) {
- AliOssCloudUtil util = new AliOssCloudUtil();
- Boolean bool = util.doesObjectExist(fileName);
- return bool;
- }
- /**
- * 下载oss对应文件
- * @param fileName 储存的文件名
- * @return
- */
- @PostMapping("/file/downLoad")
- public void downloadFile(String fileName, HttpServletResponse response) {
- try {
- AliOssCloudUtil ossClientUtil = new AliOssCloudUtil();
- InputStream is = ossClientUtil.getInputStreamByFileUrl(ossClientUtil.getFiledir() + fileName);
- // 配置文件下载
- response.setHeader("content-type", "application/octet-stream");
- response.setContentType("application/octet-stream");
- // 下载文件能正常显示中文
- response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
- OutputStream os = response.getOutputStream();
- byte[] b = new byte[1024];
- int len = -1;
- while ((len = is.read(b)) != -1) {
- os.write(b, 0, len);
- }
- is.close();
- os.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
JAVA整合阿里云OSS实现文件上传功能的更多相关文章
- 阿里云 oss 小文件上传进度显示
对阿里云OSS上传小文件时的进度,想过两个方法:一是.通过多线程监測Inputstream剩余的字节数来计算,可是由于Inputstream在两个线程中共用,假设上传线程将Inputstream关闭, ...
- 阿里云OSS Multipart Upload上传实例
原来是用的PutObject()方式上传文件的,但是当文件比较大的时候,总是报一个对方强制关闭连接导致上传失败.PS:公司的网比较渣,10MB的文件都传不上去,搜了下,说使用Multipart Upl ...
- 阿里云oss,简单上传
描述:oss比较方便,省去了自己搭建文件服务器的时间,价格比较便宜,下面是java基于oss的简单上传代码 a.添加maven依赖 <dependency> <groupId> ...
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...
- 在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 ...
- Thinkphp整合阿里云OSS图片上传实例
Thinkphp3.2整合阿里云OSS图片上传实例,图片上传至OSS可减少服务器压力,节省宽带,安全又稳定,阿里云OSS对于做负载均衡非常方便,不用传到各个服务器了 首先引入阿里云OSS类库 < ...
- springboot整合OSS实现文件上传
OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.OSS可用于图片.音视频.日志等海量文件的存储.各种终端 ...
- 整合阿里云OSS
整合阿里云OSS 一.对象存储OSS 为了解决海量数据存储与弹性扩容,采用云存储的解决方案- 阿里云OSS. 1.开通"对象存储OSS"服务 (1)申请阿里云账号 (2)实名认证 ...
- Java使用阿里云OSS对象存储上传图片
原 Java使用阿里云OSS对象存储上传图片 2017年03月27日 10:47:28 陌上桑花开花 阅读数 26804更多 分类专栏: 工作案例总结 版权声明:本文为博主原创文章,遵循CC 4.0 ...
随机推荐
- CF1539F Strange Array
这玩意为啥是紫. 考虑对每个小于\(x\)的数值设为1,大于\(x\)的数值设为-1. 那么对于答案要求的就是绝对值最大的连续段. 线段树是很显然的. 考虑我们不能对每个数都进行一遍重构,这样就退化到 ...
- 洛谷 P4272 - [CTSC2009]序列变换(堆)
洛谷题面传送门 u1s1 在我完成这篇题解之前,全网总共两篇题解,一篇使用的平衡树,一篇使用的就是这篇题解讲解的这个做法,但特判掉了一个点,把特判去掉在 BZOJ 上会 WA 一个点. 两篇题解都异常 ...
- 洛谷 P5406 - [THUPC2019]找树(FWT+矩阵树定理)
题面传送门 首先看到这道题你必须要有一个很清楚的认识:这题新定义的 \(\oplus\) 符号非常奇怪,也没有什么性质而言,因此无法通过解决最优化问题的思路来解决这个问题,只好按照计数题的思路来解决, ...
- Codeforces 585E - Present for Vitalik the Philatelist(简单莫反+狄利克雷前缀和)
Codeforces 题目传送门 & 洛谷题目传送门 一道不算太难的 D1E 罢--虽然我不会做/kk u1s1 似乎这场 Div1 挺水的?F 就是个 AC 自动机板子还被评到了 3k2-- ...
- mysql-计算排名
mysql计算排名,获取行号rowno 学生成绩表数据 SELECT * FROM table_score ORDER BY score DESC; 获取某个学生成绩排名并计算该学生和上一名学生成绩差 ...
- Go 性能提升tips--边界检查
1. 什么是边界检查? 边界检查,英文名 Bounds Check Elimination,简称为 BCE.它是 Go 语言中防止数组.切片越界而导致内存不安全的检查手段.如果检查下标已经越界了,就会 ...
- day07 MySQL索引事务
day07 MySQL索引事务 昨日内容回顾 pymysql模块 # 链接数据库都是使用这个模块的 # 创建链接 import pymysql conn = pymysql.connect( host ...
- vue开发多页面应用 - hash模式和history模式
我们知道vue可以快速开发web单页应用,而且官方为我们提供了自己的应用脚手架vue-cli,我们只需要下载脚手架,安装依赖后就可以启动vue应用雏形. 这得益与webpack的依赖追踪,各种资源后缀 ...
- ComponentScan注解的使用
在项目初始化时,会将加@component,@service...相关注解的类添加到spring容器中. 但是项目需要,项目初始化时自动过滤某包下面的类,不将其添加到容器中. 有两种实现方案, 1.如 ...
- Linux学习 - 文件系统常用命令
一.文件系统查看命令df df [选项] [挂载点] -a 查看所有文件系统信息,包括特殊文件系统 -h 使用习惯单位显示容量 -T 显示文件系统类型 -m 以MB为单位显示容量 -k 以KB为单位显 ...