package com.hundsun.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Date;
import java.util.Iterator;
import java.util.Properties;
import java.util.UUID;
public class OssService {
protected static Log log = LogFactory.getLog(OssService.class);
public static String endpoint ;
public static String accessKeyId ;
public static String accessKeySecret ;
public static String bucketName ;
static{
Properties properties = readProperties() ;
endpoint = properties.getProperty("oss.endpoint");
accessKeyId = properties.getProperty("oss.accessKeyId");
accessKeySecret = properties.getProperty("oss.accessKeySecret");
bucketName = properties.getProperty("oss.bucketName");
}
/**
* 下载文件
* 比如
* url http://xxx.com:8600/upfile/apply_submit_file/yk0.jpg
* filename apply_submit_file/yk0.jpg
* objectName upfile/apply_submit_file/yk0.jpg
*/
public static void downloadOSSfile(HttpServletResponse response, String objectName) throws IOException {
log.info("==OssServiceImpl.downloadOSSfile== start");
log.info("==endpoint=="+endpoint);
log.info("==accessKeyId=="+accessKeyId);
log.info("==accessKeySecret=="+accessKeySecret);
log.info("==bucketName=="+bucketName);
objectName = replaceStartSeq(objectName);
log.info("==OssServiceImpl.doFilter== objectName:"+objectName);
long startCreateOssTime = new Date().getTime();
OSS ossClient = OssService.getOss();
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
long endCreateOssTime = new Date().getTime();
log.info("ossClient.getObject 获取对象成功,耗时:"+((endCreateOssTime/1000)-(startCreateOssTime/1000))+"秒") ;
// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。
// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
InputStream is = ossObject.getObjectContent();
String downloadFilename = StringUtils.substringAfterLast(objectName, "/");
//文件名非正确获取时,随便生成一个
if(!StringUtils.contains(downloadFilename, ".")){
UUID uuid = UUID.randomUUID();
String fileType = StringUtils.substringAfterLast(objectName, ".");
downloadFilename = uuid+"."+fileType;
}
//让浏览器收到这份资源的时候, 以下载的方式提醒用户,而不是直接展示。
response.setHeader("Content-Disposition", "inline; filename="+downloadFilename);
//3. 转化成输入流
OutputStream os = response.getOutputStream();
int len = 0 ;
byte[]buffer = new byte[1024];
while( (len = is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
os.close();
is.close();
log.info("==OssServiceImpl.downloadOSSfile== end");
ossObject.close();
// 关闭OSSClient。
ossClient.shutdown();
}
public static void simpleDownLoad(String objectName,String localPath){
log.info("==OssServiceImpl.simpleDownLoad== start===objectName="+objectName+" localFilePathAndName==="+localPath);
objectName = replaceStartSeq(objectName);
// 创建OSSClient实例。
File localFile = new File(localPath);
File fileParent = localFile.getParentFile();
if(!fileParent.exists()){
fileParent.mkdirs();
}
//创建OSS对象
OSS ossClient = OssService.getOss();
//获取对象
long startGetObjectTime = new Date().getTime();
ossClient.getObject(new GetObjectRequest(bucketName, objectName), localFile);
long endGetObjectTime = new Date().getTime();
log.info("ossClient.getObject 获取对象成功,耗时:"+((endGetObjectTime/1000)-(startGetObjectTime/1000))+"秒") ;
// 关闭OSSClient。
ossClient.shutdown();
log.info("==OssServiceImpl.simpleDownLoad== end===objectName="+objectName+" localFilePathAndName==="+localFile);
}
public OSSObject getOssObject(String objectName){
log.info("==OssServiceImpl.getOssObject== start===objectName="+objectName);
objectName = replaceStartSeq(objectName);
//创建OSS对象
OSS ossClient = this.getOss();
//获取对象
long startGetObjectTime = new Date().getTime();
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
long endGetObjectTime = new Date().getTime();
log.info("ossClient.getObject 获取对象成功,耗时:"+((endGetObjectTime/1000)-(startGetObjectTime/1000))+"秒") ;
// 关闭OSSClient。
ossClient.shutdown();
log.info("==OssServiceImpl.getOssObject== end===objectName="+objectName);
return ossObject;
}
/**
* 上传表单提交
* 全文件名 http://web.jtpj.test:8600/upfile/apply_submit_file/yk0.jpg
* objectName upfile/apply_submit_file/yk0.jpg
*/
public static void uploadOSSform(MultipartFile uploadfile, String objectName) throws IOException{
log.info("==OssServiceImpl.uploadOSSform== start");
log.info("==endpoint=="+endpoint);
log.info("==accessKeyId=="+accessKeyId);
log.info("==accessKeySecret=="+accessKeySecret);
log.info("==bucketName=="+bucketName);
objectName = replaceStartSeq(objectName);
log.info("==OssServiceImpl.uploadOSSform== objectName:"+objectName);
// 创建OSSClient实例。
//上传文件流
InputStream inputStream = uploadfile.getInputStream();
OSS ossClient = OssService.getOss();
long startPostObjectTime = new Date().getTime();
ossClient.putObject(bucketName, objectName , inputStream);
long endPostObjectTime = new Date().getTime();
log.info("ossClient.getObject 上传对象成功,耗时:"+((endPostObjectTime/1000)-(startPostObjectTime/1000))+"秒") ;
//关闭OSSClient
ossClient.shutdown();
inputStream.close();
log.info("==OssServiceImpl.uploadOSSform== end");
}
/**
* 本地文件上传
* 访问路径 http://web.jtpj.test:8600/upfile/apply_submit_file/yk0.jpg
* 文件路径 d:/upfile/apply_submit_file/yk0.jpg
* objectName upfile/apply_submit_file/yk0.jpg
*/
public static void uploadOSSfile(File file,String objectName) throws IOException{
objectName = replaceStartSeq(objectName);
// 创建OSSClient实例。
InputStream inputStream = new FileInputStream(file);
OSS ossClient = OssService.getOss();
//上传文件流
long startPostObjectTime = new Date().getTime();
ossClient.putObject(bucketName, objectName , inputStream);
long endPostObjectTime = new Date().getTime();
log.info("ossClient.getObject 上传对象成功,耗时:"+((endPostObjectTime/1000)-(startPostObjectTime/1000))+"秒") ;
// 关闭OSSClient。
ossClient.shutdown();
inputStream.close();
log.info("==OssServiceImpl.uploadOSSfile== end");
}
/**
* 本地文件按路径上传
* 访问路径 http://web.jtpj.test:8600/upfile/apply_submit_file/yk0.jpg
* 文件路径 /upfile/apply_submit_file/yk0.jpg
* objectName upfile/apply_submit_file/yk0.jpg
*/
private static Boolean uploadAndDelFile(String tempFilePath,String objectName){
log.info("====uploadAndDelTempFile 开始 tempFilePath="+tempFilePath);
try {
File tempFile = new File(tempFilePath);
OssService.uploadOSSfile(tempFile, objectName);
if(tempFile.exists()){
tempFile.delete();
}
}catch (FileNotFoundException e){
log.error("读取不到文件:",e);
return false;
}catch (IOException e){
log.error("IOException 异常:",e);
return false;
}catch (Exception e){
log.error("发生错误:",e);
return false;
}
log.info("====uploadAndDelTempFile 成功 tempFilePath="+tempFilePath);
return true;
}
/**
* 本地文件按路径删除本地附件
* 文件路径 /upfile/apply_submit_file/yk0.jpg
*/
public static Boolean delTempFile(String tempFilePath){
log.info("====delTempFile 开始 tempFilePath="+tempFilePath);
try {
File tempFile = new File(tempFilePath);
if(tempFile.exists()){
tempFile.delete();
}
}catch (Exception e){
log.error("发生错误:",e);
return false;
}
log.info("====delTempFile 成功 tempFilePath="+tempFilePath);
return true;
}
public static Boolean uploadAndDelTempfileByAliyunFlag(String tempFilePath){
log.info("====uploadAndDelTempfileByAliyunFlag 开始 tempFilePath="+tempFilePath);
Boolean result =false;
//if(EnumAliyunFlagStatus.on.getCode().equals(aliyunFlag)){
String distOssFilePath = null;
distOssFilePath = replaceStartSeq(tempFilePath);
result =OssService.uploadAndDelFile(tempFilePath,distOssFilePath);
//}
log.info("====uploadAndDelTempfileByAliyunFlag 结束 结果为:"+result+" tempFilePath="+tempFilePath);
return result;
}
public static String replaceStartSeq(String path){
if(path.startsWith("/")){
path = path.substring(1,path.length());
path = replaceStartSeq(path);
}
return path;
}
/**
*删除oss附件
* objectName upfile/apply_submit_file/yk0.jpg
*
* descibe:删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
ossClient.deleteObject(bucketName, objectName);
*/
public static void delOSSfile(String objectName) throws IOException{
log.info("==OssService.deleteOSSfile== start objectName:"+objectName);
objectName = replaceStartSeq(objectName);
// 创建OSSClient实例。
//删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
OSS ossClient = OssService.getOss();
ossClient.deleteObject(bucketName, objectName);
// 关闭OSSClient。
ossClient.shutdown();
log.info("==OssService.deleteOSSfile== end");
}
public static OSS getOss(){
long startCreateOssTime = new Date().getTime();
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
long endCreateOssTime = new Date().getTime();
log.info("ossClient.getObject 获取OSSClient成功,耗时:"+((endCreateOssTime/1000)-(startCreateOssTime/1000))+"秒") ;
return ossClient;
}
public static Properties readProperties(){
Properties prop = new Properties();
try{
//读取属性文件a.properties
InputStream in = OssService.class.getResourceAsStream("/server.properties");
prop.load(in); ///加载属性列表
Iterator<String> it=prop.stringPropertyNames().iterator();
while(it.hasNext()){
String key=it.next();
}
in.close();
}catch(Exception e){
log.error("==readProperties==",e);
}
return prop;
}
}