所需jar包
com.aliyun.oss
aliyun-sdk-oss
2.8.3
工具类:
OSSUploadUtil
package com.hxf.application.util.ossfileutil;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import org.springframework.stereotype.Component;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
* @program: demo
* @description: oss
* @create: 2018-12-18 17:08
**/
@Component
public class OSSUploadUtil {
private static OSSConfig config = null;
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
/**
* @param file
* @param fileType 文件后缀
* @oaram business 业务目录
* @return String 文件地址
* @MethodName: uploadFile
* @Description: OSS单文件上传
*/
public static String uploadFile(File file, String fileType,String business) {
config = config == null ? new OSSConfig() : config;
String fileName = business +"/"+sdf.format(new Date()) +"/"+ UUID.randomUUID().toString().toUpperCase().replace("-", "") + "." + fileType; //文件名,根据UUID来
return putObject(file, fileType, fileName);
}
/**
* @param file
* @param fileType 文件后缀
* @return String 文件地址
* @MethodName: uploadFile
* @Description: OSS单文件上传
*/
public static String uploadFile(File file, String fileType) {
config = config == null ? new OSSConfig() : config;
String fileName = sdf.format(new Date()) +"/"+ UUID.randomUUID().toString().toUpperCase().replace("-", "") + "." + fileType; //文件名,根据UUID来
return putObject(file, fileType, fileName);
}
/**
* @param file
* @param fileType
* @param oldUrl
* @return String
* @MethodName: updateFile
* @Description: 更新文件:只更新内容,不更新文件名和文件地址。
* (因为地址没变,可能存在浏览器原数据缓存,不能及时加载新数据,例如图片更新,请注意)
*/
public static String updateFile(File file, String fileType, String oldUrl) {
if (oldUrl == null) return null;
return putObject(file, fileType, oldUrl);
}
/**
* @param file
* @param fileType 文件后缀
* @param oldUrl 需要删除的文件地址
* @return String 文件地址
* @MethodName: replaceFile
* @Description: 替换文件:删除原文件并上传新文件,文件名和地址同时替换
* 解决原数据缓存问题,只要更新了地址,就能重新加载数据)
*/
public static String replaceFile(File file, String fileType, String oldUrl) {
boolean flag = deleteFile(oldUrl); //先删除原文件
if (!flag) {
//更改文件的过期时间,让他到期自动删除。
}
return uploadFile(file, fileType);
}
/**
* @param fileUrl 需要删除的文件url
* @return boolean 是否删除成功
* @MethodName: deleteFile
* @Description: 单文件删除
*/
public static boolean deleteFile(String fileUrl) {
config = config == null ? new OSSConfig() : config;
String url = "http://" +config.getBucketName() + "." + config.getEndpoint() + fileUrl;
String bucketName = OSSUploadUtil.getBucketName(url); //根据url获取bucketName
String fileName = OSSUploadUtil.getFileName(url); //根据url获取fileName
if (bucketName == null || fileName == null) return false;
OSSClient ossClient = null;
try {
ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
GenericRequest request = new DeleteObjectsRequest(bucketName).withKey(fileName);
ossClient.deleteObject(request);
} catch (Exception oe) {
oe.printStackTrace();
return false;
} finally {
ossClient.shutdown();
}
return true;
}
/**
* @param fileUrls 需要删除的文件url集合
* @return int 成功删除的个数
* @MethodName: batchDeleteFiles
* @Description: 批量文件删除(较快):适用于相同endPoint和BucketName
*/
public static int deleteFile(List fileUrls) {
int deleteCount = 0; //成功删除的个数
String bucketName = OSSUploadUtil.getBucketName(fileUrls.get(0)); //根据url获取bucketName
List fileNames = OSSUploadUtil.getFileName(fileUrls); //根据url获取fileName
if (bucketName == null || fileNames.size() <= 0) return 0;
OSSClient ossClient = null;
try {
ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName).withKeys(fileNames);
DeleteObjectsResult result = ossClient.deleteObjects(request);
deleteCount = result.getDeletedObjects().size();
} catch (OSSException oe) {
oe.printStackTrace();
throw new RuntimeException("OSS服务异常:", oe);
} catch (ClientException ce) {
ce.printStackTrace();
throw new RuntimeException("OSS客户端异常:", ce);
} finally {
ossClient.shutdown();
}
return deleteCount;
}
/**
* @param fileUrls 需要删除的文件url集合
* @return int 成功删除的个数
* @MethodName: batchDeleteFiles
* @Description: 批量文件删除(较慢):适用于不同endPoint和BucketName
*/
public static int deleteFiles(List fileUrls) {
int count = 0;
for (String url : fileUrls) {
if (deleteFile(url)) {
count++;
}
}
return count;
}
/**
* @param file
* @param fileType
* @param fileName
* @return String
* @MethodName: putObject
* @Description: 上传文件
*/
private static String putObject(File file, String fileType, String fileName) {
config = config == null ? new OSSConfig() : config;
String url = null; //默认null
OSSClient ossClient = null;
try {
ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
InputStream input = new FileInputStream(file);
ObjectMetadata meta = new ObjectMetadata(); // 创建上传Object的Metadata
meta.setContentType(OSSUploadUtil.contentType(fileType)); // 设置上传内容类型
meta.setCacheControl("no-cache"); // 被下载时网页的缓存行为
PutObjectRequest request = new PutObjectRequest(config.getBucketName(), fileName, input, meta); //创建上传请求
ossClient.putObject(request);
//url = "http://" +config.getBucketName() + "." + config.getEndpoint() + "/" + fileName; //上传成功再返回的文件路径
url = fileName; //上传成功再返回域名后文件路径
} catch (OSSException oe) {
oe.printStackTrace();
return null;
} catch (ClientException ce) {
ce.printStackTrace();
return null;
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} finally {
ossClient.shutdown();
}
return url;
}
/**
* @param fileType
* @return String
* @MethodName: contentType
* @Description: 获取文件类型
*/
private static String contentType(String fileType) {
fileType = fileType.toLowerCase();
String contentType = "";
switch (fileType) {
case "bmp":
contentType = "image/bmp";
break;
case "gif":
contentType = "image/gif";
break;
case "png":
case "jpeg":
case "jpg":
contentType = "image/jpeg";
break;
case "html":
contentType = "text/html";
break;
case "txt":
contentType = "text/plain";
break;
case "vsd":
contentType = "application/vnd.visio";
break;
case "ppt":
case "pptx":
contentType = "application/vnd.ms-powerpoint";
break;
case "doc":
case "docx":
contentType = "application/msword";
break;
case "xml":
contentType = "text/xml";
break;
case "mp4":
contentType = "video/mp4";
break;
default:
contentType = "application/octet-stream";
break;
}
return contentType;
}
/**
* @param fileUrl 文件url
* @return String bucketName
* @MethodName: getBucketName
* @Description: 根据url获取bucketName
*/
private static String getBucketName(String fileUrl) {
String http = "http://";
String https = "https://";
int httpIndex = fileUrl.indexOf(http);
int httpsIndex = fileUrl.indexOf(https);
int startIndex = 0;
if (httpIndex == -1) {
if (httpsIndex == -1) {
return null;
} else {
startIndex = httpsIndex + https.length();
}
} else {
startIndex = httpIndex + http.length();
}
int endIndex = fileUrl.indexOf(".oss-");
return fileUrl.substring(startIndex, endIndex);
}
/**
* @param fileUrl 文件url
* @return String fileName
* @MethodName: getFileName
* @Description: 根据url获取fileName
*/
public static String getFileName(String fileUrl) {
String str = config.getBucketName()+"."+config.getEndpoint();
int beginIndex = fileUrl.indexOf(str);
if (beginIndex == -1) return null;
return fileUrl.substring(beginIndex + str.length());
}
/**
* @param fileUrls 文件url
* @return List fileName集合
* @MethodName: getFileName
* @Description: 根据url获取fileNames集合
*/
private static List getFileName(List fileUrls) {
List names = new ArrayList<>();
for (String url : fileUrls) {
names.add(getFileName(url));
}
return names;
}
/***
* 文件下载
* @param name
* @return
* @throws IOException
*/
public static InputStream download (String name) throws IOException {
config = config == null ? new OSSConfig() : config;
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSSObject ossObject = ossClient.getObject(config.getBucketName(), name);
// 读取文件内容。
InputStream is = ossObject.getObjectContent();
// 关闭OSSClient。
ossClient.shutdown();
return is;
}
}
OSSFileUtil
package com.hxf.application.util.ossfileutil;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @program:
* @description: OSS服务器操作工具类
* @create: 2018-12-19 01:45
**/
@Component
public class OSSFileUtil {
/***
* 单个上传
* @param is
* @param business 业务分区
* @return 返回域名后路径
* @throws IOException
*/
public static String UploadFile(MultipartFile is , String business) throws IOException {
String fileSuffixName = is.getOriginalFilename().substring(is.getOriginalFilename().lastIndexOf(".")+1);
File f = null;
if(is.equals("")||is.getSize()<=0){
is = null;
}else{
InputStream ins = is.getInputStream();
f=new File(is.getOriginalFilename());
OSSUtil.inputStreamToFile(ins, f);
}
String s= OSSUploadUtil.uploadFile(f,fileSuffixName,business);
File del = new File(f.toURI());
del.delete();
return s;
}
/***
* 多个上传
* @param list
* @param business 业务分区
* @return 返回域名后路径
* @throws IOException
*/
public static String UploadFileList(List list , String business) throws IOException {
String s="";
for (MultipartFile is: list) {
String fileSuffixName = is.getOriginalFilename().substring(is.getOriginalFilename().lastIndexOf(".")+1);
File f = null;
if(is.equals("")||is.getSize()<=0){
is = null;
}else{
InputStream ins = is.getInputStream();
f=new File(is.getOriginalFilename());
OSSUtil.inputStreamToFile(ins, f);
}
OSSUploadUtil.uploadFile(f,fileSuffixName,business);
File del = new File(f.toURI());
del.delete();
}
return s;
}
/***
* 文件更新
* @param is
* @param oldurl 需要更新的url
* @return 返回更新后域名后路径
* @throws IOException
*/
public static String UpdateFile (MultipartFile is,String oldurl) throws IOException {
String fileSuffixName = is.getOriginalFilename().substring(is.getOriginalFilename().lastIndexOf(".")+1);
File f = null;
if(is.equals("")||is.getSize()<=0){
is = null;
}else{
InputStream ins = is.getInputStream();
f=new File(is.getOriginalFilename());
OSSUtil.inputStreamToFile(ins, f);
}
String s= OSSUploadUtil.updateFile(f,fileSuffixName,oldurl);
File del = new File(f.toURI());
del.delete();
return s;
}
/***
* 文件删除
* @param url
* @throws IOException
*/
public static boolean DeleteFile(String url) {
boolean s= OSSUploadUtil.deleteFile(url);
return s ;
}
}
OSSConfig
package com.hxf.application.util.ossfileutil;
import java.io.IOException;
/**
* @program: demo
* @description: oss配置类
* @create: 2018-12-18 17:03
**/
public class OSSConfig {
private String endpoint; //连接区域地址
private String accessKeyId; //连接keyId
private String accessKeySecret;//连接秘钥
private String bucketName; //需要存储的bucketName
private String picLocation; //图片保存路径
public OSSConfig() {
try {
this.endpoint = SystemConfig.getConfigResource("endpoint");
this.bucketName = SystemConfig.getConfigResource("bucketName");
this.picLocation = SystemConfig.getConfigResource("picLocation");
this.accessKeyId = SystemConfig.getConfigResource("accessKeyId");
this.accessKeySecret = SystemConfig.getConfigResource("accessKeySecret");
} catch (IOException e) {
e.printStackTrace();
}
}
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public String getPicLocation() {
return picLocation;
}
public void setPicLocation(String picLocation) {
this.picLocation = picLocation;
}
}
加载配置文件类SystemConfig
package com.hxf.application.util.ossfileutil;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @program: demo
* @description:
* @create: 2018-12-18 17:04
**/
public class SystemConfig {
private static final String CONFIG_PROPERTIES="config.properties";
public static String getConfigResource(String key) throws IOException {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Properties properties = new Properties();
InputStream in = loader.getResourceAsStream(CONFIG_PROPERTIES);
properties.load(in);
String value = properties.getProperty(key);
// 编码转换,从ISO-8859-1转向指定编码
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
in.close();
return value;
}
}
配置文件config.properties
#阿里云OSS
endpoint = *********
bucketName = ***-***-***
picLocation =
accessKeyId = L*********8
accessKeySecret = c************************p
记录OSS对象存储,有问题麻烦帮忙指出来,我方便及时修正