package com.hez.platform.admin.config.upload;
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.stereotype.Component;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
@Component
public class AliyunOSSUtils {
public final static String ENDPOINT = "oss-cn-zhangjiakou.aliyuncs.com";//地址
public final static String ACCESS_KEY_ID = "LTAI4G9Zu76XHPyuGiEYyPbj"; //阿里云密钥 在密钥管理中。//假的id,只参考长度和类型
public final static String ACCESS_KEY_SECRET = "cECnINfI4f8vzsxtORoUjz9T25XOAz";//阿里云密钥 在密钥管理中。//假的id,只参考长度和类型
public final static String BUCKET_NAME = "tbfwq"; //平台文件夹地址
/**
* 开启oss client
*
* @return
*/
public static OSSClient getOSSClients() {
OSSClient ossClient = new OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
return ossClient;
}
/**
* 关闭oss client
*
* @param ossClient
*/
public static void closeOSSClients(OSSClient ossClient) {
ossClient.shutdown();
}
/**
* 上传文件到oss
*/
public static String upload(InputStream inputStream, String filename) {
OSSClient ossClient = getOSSClients();
PutObjectResult result = ossClient.putObject(BUCKET_NAME, filename, inputStream);
String etag = result.getETag();
System.out.println(etag);
// 设置URL过期时间为10年 3600l* 1000*24*365*10
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(BUCKET_NAME, filename, HttpMethod.GET);
request.setExpiration(expiration);
// 获取URL(HTTP GET请求)。
URL signedUrl = ossClient.generatePresignedUrl(request);
// 文件路径,放到浏览器可直接下载
String url = signedUrl.getHost() + signedUrl.getPath();
closeOSSClients(ossClient);
return url;
}
/**
* 下载文件(返回流) filename 需要下载的文件名称
*/
public static InputStream downloads(String filename) {
OSSClient ossClient = getOSSClients();
InputStream content = null;
try {
//OSSObject ossObj = ossClient.getObject(new GetObjectRequest(BUCKET_NAME, filename));
//文件如果在子文件夹下,key需要带上文件夹,例如2020/08/14/1234.jpg
OSSObject ossObj = ossClient.getObject(BUCKET_NAME, "2020/08/14/1234.jpg");
content = ossObj.getObjectContent();
return content;
} catch (Exception e) {
e.printStackTrace();
throw e;
}finally {
closeOSSClients(ossClient);
}
}
/**
* 删除文件
*/
public static void delete(String filename) {
OSSClient ossClient = getOSSClients();
ossClient.deleteObject(BUCKET_NAME, filename);
closeOSSClients(ossClient);
}
public static void main(String[] args) throws IOException {
//上传文件,传入文件流
// File file = new File("C:\\Users\\admin\\Desktop\\123.jpg");
// InputStream is = new FileInputStream(file);
// upload(is,"12345");
//删除文件,传入文件名称,不要后缀
// delete("12345");
//下载文件,传入文件名称,不要后缀
InputStream content = downloads("12345");
int index;
byte[] bytes = new byte[1024];
//写入到某盘下,自定义名字,
//这里注意,如果写成new FileOutputStream("E:/")这样也会报key不存在,这是个坑。之前测下载时一直报错key不存在。找了一小天才找到这里不给个写入文件的名字也会报key不存在。
FileOutputStream downloadFile = new FileOutputStream("E:/12345.jpg");
while ((index = content.read(bytes)) != -1) {
downloadFile.write(bytes, 0, index);
downloadFile.flush();
}
downloadFile.close();
content.close();
// InputStream in = download("2ed4cb7216744f84a0269b842455fd37.zip");
// System.out.println(in.available());
}
}