上传阿里云工具类 ----私藏


config.properties

阿里云OSS配置

Export from zookeeper configuration group: [/appconfig/itfin-system] - [1.0.0] - [aliyun.oss.properties].

accessKeyId=*
accessKeySecret=*
bucketName=**
endpoint=https://oss-cn-beijing.aliyuncs.com

上传文件所在目录

filedir=

访问路径前缀

urlPrefix=


import java.io.IOException;

/**
* @author Create By MengWeiDao 2018/3/2 0002
*/
public class OSSConfig {
private String endpoint; //连接区域地址
private String accessKeyId; //连接keyId
private String accessKeySecret; //连接秘钥
private String bucketName; //需要存储的bucketName
private String filedir; //存储路径前缀
private String urlPrefix; //url前缀

public OSSConfig() {
    try {
        this.endpoint = SystemConfig.getConfigResource("endpoint");
        this.bucketName = SystemConfig.getConfigResource("bucketName");
        this.accessKeyId = SystemConfig.getConfigResource("accessKeyId");
        this.accessKeySecret = SystemConfig.getConfigResource("accessKeySecret");
        this.filedir = SystemConfig.getConfigResource("filedir");
        this.urlPrefix = SystemConfig.getConfigResource("urlPrefix");
    } 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 getFiledir() {
    return filedir;
}

public void setFiledir(String filedir) {
    this.filedir = filedir;
}

public String getUrlPrefix() {
    return urlPrefix;
}

public void setUrlPrefix(String urlPrefix) {
    this.urlPrefix = urlPrefix;
}

}


import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
* @author Create By MengWeiDao 2018/3/2 0002
*/
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;
}
}


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.aliyun.oss.model.GenericRequest;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

/**
* 阿里云OSS文件上传工具类
* Create By MengWeiDao 2018/3/2 0002
*/
public class OSSUploadUtil {

private static OSSConfig config = null;

/**
 * 上传文件返回远程url
 * @param multfile 接收到的文件流
 * @return
 * @throws IOException
 */
public static String uploadMultipartFile(MultipartFile multfile){
    config = config == null ? new OSSConfig() : config;
    String fileName = config.getFiledir() + UUID.randomUUID().toString().toUpperCase().replace("-", "")
            + multfile.getOriginalFilename().substring(multfile.getOriginalFilename().lastIndexOf(".")); //文件名,根据UUID来
    String url = null;      //默认null
    OSSClient ossClient = null;
    try {
        ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
        InputStream input = multfile.getInputStream();
        ObjectMetadata meta = new ObjectMetadata();             // 创建上传Object的Metadata
        meta.setContentType(multfile.getContentType());       // 设置上传内容类型
        meta.setCacheControl("no-cache");                   // 被下载时网页的缓存行为
        PutObjectRequest request = new PutObjectRequest(config.getBucketName(), fileName, input, meta);           //创建上传请求
        ossClient.putObject(request);
        url = config.getEndpoint().replaceFirst("https://", "https://" + config.getBucketName() + ".") + "/" + fileName;       //上传成功再返回的文件路径
    } catch (OSSException oe) {
        oe.printStackTrace();
        return null;
    } catch (ClientException ce) {
        ce.printStackTrace();
        return null;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    } finally {
        ossClient.shutdown();
    }
    return url;
}

/**
 * MultipartFile 转换成File
 * @param multfile 原文件类型
 * @return File
 * @throws IOException
 */
public static File multipartToFile(MultipartFile multfile) {
    CommonsMultipartFile cf = (CommonsMultipartFile) multfile;
    //这个myfile是MultipartFile的
    DiskFileItem fi = (DiskFileItem) cf.getFileItem();
    File file = fi.getStoreLocation();
    return file;
}

/**
 * @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 = config.getFiledir() + 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) {
    String fileName = getFileName(oldUrl);
    if (fileName == null) return null;
    return putObject(file, fileType, fileName);
}

/**
 * @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 bucketName = OSSUploadUtil.getBucketName(fileUrl);       //根据url获取bucketName
    String fileName = OSSUploadUtil.getFileName(fileUrl);           //根据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<String> fileUrls) {
    int deleteCount = 0;    //成功删除的个数
    String bucketName = OSSUploadUtil.getBucketName(fileUrls.get(0));       //根据url获取bucketName
    List<String> 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<String> 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 = config.getEndpoint().replaceFirst("https://", "https://" + config.getBucketName() + ".") + "/" + 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: 获取文件类型
 */
public 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
 */
private static String getFileName(String fileUrl) {
    String str = "aliyuncs.com/";
    int beginIndex = fileUrl.indexOf(str);
    if (beginIndex == -1) return null;
    return fileUrl.substring(beginIndex + str.length());
}

/**
 * @param fileUrls 文件url
 * @return List<String>  fileName集合
 * @MethodName: getFileName
 * @Description: 根据url获取fileNames集合
 */
private static List<String> getFileName(List<String> fileUrls) {
    List<String> names = new ArrayList<>();
    for (String url : fileUrls) {
        names.add(getFileName(url));
    }
    return names;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值