123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- package org.jeecg.common.util.oss;
- import com.aliyun.oss.ClientConfiguration;
- import com.aliyun.oss.OSSClient;
- import com.aliyun.oss.common.auth.DefaultCredentialProvider;
- import com.aliyun.oss.model.CannedAccessControlList;
- import com.aliyun.oss.model.OSSObject;
- import com.aliyun.oss.model.PutObjectResult;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.tomcat.util.http.fileupload.FileItemStream;
- import org.jeecg.common.util.CommonUtils;
- import org.jeecg.common.util.filter.FileTypeFilter;
- import org.jeecg.common.util.filter.StrAttackFilter;
- import org.jeecg.common.util.oConvertUtils;
- import org.springframework.web.multipart.MultipartFile;
- import java.io.BufferedInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.URL;
- import java.net.URLDecoder;
- import java.util.Date;
- import java.util.UUID;
- /**
- * @Description: 阿里云 oss 上传工具类(高依赖版)
- * @Date: 2019/5/10
- */
- @Slf4j
- public class OssBootUtil {
- private static String endPoint;
- private static String accessKeyId;
- private static String accessKeySecret;
- private static String bucketName;
- private static String staticDomain;
- public static void setEndPoint(String endPoint) {
- OssBootUtil.endPoint = endPoint;
- }
- public static void setAccessKeyId(String accessKeyId) {
- OssBootUtil.accessKeyId = accessKeyId;
- }
- public static void setAccessKeySecret(String accessKeySecret) {
- OssBootUtil.accessKeySecret = accessKeySecret;
- }
- public static void setBucketName(String bucketName) {
- OssBootUtil.bucketName = bucketName;
- }
- public static void setStaticDomain(String staticDomain) {
- OssBootUtil.staticDomain = staticDomain;
- }
- public static String getStaticDomain() {
- return staticDomain;
- }
- public static String getEndPoint() {
- return endPoint;
- }
- public static String getAccessKeyId() {
- return accessKeyId;
- }
- public static String getAccessKeySecret() {
- return accessKeySecret;
- }
- public static String getBucketName() {
- return bucketName;
- }
- public static OSSClient getOssClient() {
- return ossClient;
- }
- /**
- * oss 工具客户端
- */
- private static OSSClient ossClient = null;
- /**
- * 上传文件至阿里云 OSS
- * 文件上传成功,返回文件完整访问路径
- * 文件上传失败,返回 null
- *
- * @param file 待上传文件
- * @param fileDir 文件保存目录
- * @return oss 中的相对文件路径
- */
- public static String upload(MultipartFile file, String fileDir,String customBucket) {
- String FILE_URL = null;
- initOSS(endPoint, accessKeyId, accessKeySecret);
- StringBuilder fileUrl = new StringBuilder();
- String newBucket = bucketName;
- if(oConvertUtils.isNotEmpty(customBucket)){
- newBucket = customBucket;
- }
- try {
- //判断桶是否存在,不存在则创建桶
- if(!ossClient.doesBucketExist(newBucket)){
- ossClient.createBucket(newBucket);
- }
- // 获取文件名
- String orgName = file.getOriginalFilename();
- if("" == orgName){
- orgName=file.getName();
- }
- //update-begin-author:liusq date:20210809 for: 过滤上传文件类型
- FileTypeFilter.fileTypeFilter(file);
- //update-end-author:liusq date:20210809 for: 过滤上传文件类型
- orgName = CommonUtils.getFileName(orgName);
- String fileName = orgName.indexOf(".")==-1
- ?orgName + "_" + System.currentTimeMillis()
- :orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
- if (!fileDir.endsWith("/")) {
- fileDir = fileDir.concat("/");
- }
- //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
- fileDir=StrAttackFilter.filter(fileDir);
- //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
- fileUrl = fileUrl.append(fileDir + fileName);
- if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
- FILE_URL = staticDomain + "/" + fileUrl;
- } else {
- FILE_URL = "https://" + newBucket + "." + endPoint + "/" + fileUrl;
- }
- PutObjectResult result = ossClient.putObject(newBucket, fileUrl.toString(), file.getInputStream());
- // 设置权限(公开读)
- // ossClient.setBucketAcl(newBucket, CannedAccessControlList.PublicRead);
- if (result != null) {
- log.info("------OSS文件上传成功------" + fileUrl);
- }
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- return FILE_URL;
- }
- /**
- * 获取原始URL
- * @param url: 原始URL
- * @Return: java.lang.String
- */
- public static String getOriginalUrl(String url) {
- String originalDomain = "https://" + bucketName + "." + endPoint;
- if(url.indexOf(staticDomain)!=-1){
- url = url.replace(staticDomain,originalDomain);
- }
- return url;
- }
- /**
- * 文件上传
- * @param file
- * @param fileDir
- * @return
- */
- public static String upload(MultipartFile file, String fileDir) {
- return upload(file, fileDir,null);
- }
- /**
- * 上传文件至阿里云 OSS
- * 文件上传成功,返回文件完整访问路径
- * 文件上传失败,返回 null
- *
- * @param file 待上传文件
- * @param fileDir 文件保存目录
- * @return oss 中的相对文件路径
- */
- public static String upload(FileItemStream file, String fileDir) {
- String FILE_URL = null;
- initOSS(endPoint, accessKeyId, accessKeySecret);
- StringBuilder fileUrl = new StringBuilder();
- try {
- String suffix = file.getName().substring(file.getName().lastIndexOf('.'));
- String fileName = UUID.randomUUID().toString().replace("-", "") + suffix;
- if (!fileDir.endsWith("/")) {
- fileDir = fileDir.concat("/");
- }
- fileDir = StrAttackFilter.filter(fileDir);
- fileUrl = fileUrl.append(fileDir + fileName);
- if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
- FILE_URL = staticDomain + "/" + fileUrl;
- } else {
- FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
- }
- PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream());
- // 设置权限(公开读)
- ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
- if (result != null) {
- log.info("------OSS文件上传成功------" + fileUrl);
- }
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- return FILE_URL;
- }
- /**
- * 删除文件
- * @param url
- */
- public static void deleteUrl(String url) {
- deleteUrl(url,null);
- }
- /**
- * 删除文件
- * @param url
- */
- public static void deleteUrl(String url,String bucket) {
- String newBucket = bucketName;
- if(oConvertUtils.isNotEmpty(bucket)){
- newBucket = bucket;
- }
- String bucketUrl = "";
- if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
- bucketUrl = staticDomain + "/" ;
- } else {
- bucketUrl = "https://" + newBucket + "." + endPoint + "/";
- }
- url = url.replace(bucketUrl,"");
- ossClient.deleteObject(newBucket, url);
- }
- /**
- * 删除文件
- * @param fileName
- */
- public static void delete(String fileName) {
- ossClient.deleteObject(bucketName, fileName);
- }
- /**
- * 获取文件流
- * @param objectName
- * @param bucket
- * @return
- */
- public static InputStream getOssFile(String objectName,String bucket){
- InputStream inputStream = null;
- try{
- String newBucket = bucketName;
- if(oConvertUtils.isNotEmpty(bucket)){
- newBucket = bucket;
- }
- initOSS(endPoint, accessKeyId, accessKeySecret);
- OSSObject ossObject = ossClient.getObject(newBucket,objectName);
- inputStream = new BufferedInputStream(ossObject.getObjectContent());
- }catch (Exception e){
- log.info("文件获取失败" + e.getMessage());
- }
- return inputStream;
- }
- /**
- * 获取文件流
- * @param objectName
- * @return
- */
- public static InputStream getOssFile(String objectName){
- return getOssFile(objectName,null);
- }
- /**
- * 获取文件外链
- * @param bucketName
- * @param objectName
- * @param expires
- * @return
- */
- public static String getObjectURL(String bucketName, String objectName, Date expires) {
- initOSS(endPoint, accessKeyId, accessKeySecret);
- try{
- if(ossClient.doesObjectExist(bucketName,objectName)){
- URL url = ossClient.generatePresignedUrl(bucketName,objectName,expires);
- return URLDecoder.decode(url.toString(),"UTF-8");
- }
- }catch (Exception e){
- log.info("文件路径获取失败" + e.getMessage());
- }
- return null;
- }
- /**
- * 初始化 oss 客户端
- *
- * @return
- */
- private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) {
- if (ossClient == null) {
- ossClient = new OSSClient(endpoint,
- new DefaultCredentialProvider(accessKeyId, accessKeySecret),
- new ClientConfiguration());
- }
- return ossClient;
- }
- /**
- * 上传文件到oss
- * @param stream
- * @param relativePath
- * @return
- */
- public static String upload(InputStream stream, String relativePath) {
- String FILE_URL = null;
- String fileUrl = relativePath;
- initOSS(endPoint, accessKeyId, accessKeySecret);
- if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
- FILE_URL = staticDomain + "/" + relativePath;
- } else {
- FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
- }
- PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(),stream);
- // 设置权限(公开读)
- ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
- if (result != null) {
- log.info("------OSS文件上传成功------" + fileUrl);
- }
- return FILE_URL;
- }
- }
|