引入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实现文件上传功能的更多相关文章

  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. Codeforces 1411G - No Game No Life(博弈论+生成函数+FWTxor)

    Codeforces 题面传送门 & 洛谷题面传送门 一道肥肠套路的题目. 首先这题涉及博弈论.注意到这里每一个棋子的移动方式都是独立的,因此可以考虑 SG 定理.具体来说,我们先求出每个棋子 ...

  2. BZOJ 3694&&DTOJ 1972: 最短路

    题目描述 给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1.定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1到i的最短路径,边集T构成最短路树. ...

  3. MariaDB—备份数据库

    1> 备份单个数据库 mysqldump -uroot -plichao123 --database students1 > stundents.sql; 2>查看备份文件 3> ...

  4. 8.Maximum Depth of Binary Tree

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  5. 表格table的宽度问题

    首先注意table的一个样式 table { table-layout:fixed; } table-layout有以下取值: automatic 默认.列宽度由单元格内容设定 fixed 列宽由表格 ...

  6. Scala(二)【基本使用】

    一.变量和数据类型 1.变量 语法:val / var 变量名:变量类型 = 值 val name:String = "zhangsan" 注意 1.val定义的变量想到于java ...

  7. webpack打包报错 ERROR in ./js/ww.js from UglifyJs Unexpected token keyword «function», expected punc «,» [src/page/ww/view/xx/xx.vue:119,0][./js/ww.js:55218,17]

    找了好多解决办法 你可以试着将babel-loader的exclude注释掉,然后看能否打包成功.如果可以,那就是这个问题.你只需要在vue.config.js中配置transpileDependen ...

  8. css相关,flex布局全通!

    寻根溯源话布局 一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平.垂直同时居中. 记得刚开始学习 CSS 的时候,看到 float 属性不由得感觉眼前一亮,顺理成章的联想到 Word 文 ...

  9. JVM——对象已“死”的判定

    主要针对Java堆和方法区 1.判断对象是否已"死" Java堆中存放着几乎所有的对象实例,垃圾回收器在对堆进行回收之前,首先应该判断这些对象哪些还"存活",哪 ...

  10. android Paint 详解

    /**     * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体 ...