阿里云oss服务器上传工具代码

结合了官方还有一些网上的资料,说原创也不是原创,且看看咯

package com.deceen.common.utils.aliyun;

import com.aliyun.oss.*;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.deceen.common.Enums.ResultEnum;
import com.deceen.common.utils.StringUtil;
import com.deceen.common.utils.myexception.MyException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.Random;

/**
 * @author: zzx
 * @date: 2018/12/5 11:03
 * @description: 阿里云-oss服务器工具类
 */
@Slf4j
@Component
public class AliyunOssUtil {

    private static String endpoint = "***";

    /*ram子账户AccessKeyID*/
    private static String accessKeyId = "***";
    /*ram子账户AccessKeySecret*/
    private static String accessKeySecret = "****";
    private static String bucketName = "***";

    /*构造一个用于访问OSS的客户端实例*/
    private OSS client = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);

    /**
     * @author: zzx
     * @date: 2018-12-05 16:46
     * @param file 上传文件
     * @deprecation: 上传文件到oss
     *               大小限制:5m;格式:.bmp、.gif、.jpeg、.jpg、.png
     * @return: 文件名字
    */
    public String uploadImg(MultipartFile file) {
        if (file.getSize() > 5* 1024 * 1024) {
            throw new MyException(ResultEnum.UPLOAD_FILE_SIZE_OVER);
        }
        String originalFilename = file.getOriginalFilename();
        String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
        Random random = new Random();
        String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
        try {
            InputStream inputStream = file.getInputStream();
            String contentType = getContentTypeForImg(name.substring(name.lastIndexOf(".")));
            this.UploadFile(inputStream, name,contentType);
            return name;
        }catch (MyException me){
            throw new MyException(me.getCode(),me.getMessage());
        }catch (Exception e) {
            throw new MyException(ResultEnum.UPLOAD_FILE_FAILED);
        }
    }

    /**
     * @author: zzx
     * @date: 2018-12-05 16:46
     * @param file 上传文件
     * @deprecation: 上传文件到oss
     *               大小限制:20m;格式:.bmp、.gif、.jpeg、.jpg、.png
     * @return: 文件名字
     */
    public String uploadVideo(MultipartFile file) {
        if (file.getSize() > 20* 1024 * 1024) {
            throw new MyException(ResultEnum.UPLOAD_FILE_SIZE_OVER);
        }
        String originalFilename = file.getOriginalFilename();
        String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
        Random random = new Random();
        String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
        try {
            InputStream inputStream = file.getInputStream();
            String contentType = getContentTypeForVideo(name.substring(name.lastIndexOf(".")));
            this.UploadFile(inputStream, name,contentType);
            return name;
        }catch (MyException me){
            throw new MyException(me.getCode(),me.getMessage());
        }catch (Exception e) {
            throw new MyException(ResultEnum.UPLOAD_FILE_FAILED);
        }
    }

    /**
     * @author: zzx
     * @date: 2018-12-05 16:49
     * @param fileUrl oss的key
     * @deprecation: 根据oss存储的key查询出url
     * @return: 返回图片url
    */
    public String getObjectUrl(String fileUrl) {
        if (StringUtil.isNotEmpty(fileUrl)) {
            String[] split = fileUrl.split("/");
            return this.getUrl(split[split.length - 1]);
        }
        return null;
    }

    /**
     * @author: zzx
     * @date: 2018-12-05 16:52
     * @param key oss的key
     * @deprecation: 根据key返回url
     * @return: oss存储url
    */
    public String getUrl(String key) {
        // 设置URL过期时间为10年  3600l* 1000*24*365*10
        Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
        // 生成URL
        URL url = client.generatePresignedUrl(bucketName, key, expiration);
        if (url != null) {
            return url.toString();
        }
        return null;
    }

    /**
     * @author: zzx
     * @date: 2018-12-05 15:55
     * @param inputStream 上传的文件流
     * @param objectName 对象名称 包括后缀名
     * @param contentType 请求头格式
     * @deprecation: 上传文件到oss
     * @throws IOException
     * @return 出错返回"",唯一MD5数字签名
    */
    public String UploadFile(InputStream inputStream,String objectName,String contentType) throws IOException{
        client = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
        String ret = "";
        try{
            log.info(inputStream.hashCode()+"上传io流到OSS");

            //创建上传Object的metadata
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentLength(inputStream.available());
            objectMetadata.setCacheControl("no-cache");
            objectMetadata.setHeader("Pragma","no-cache");
            objectMetadata.setContentType(contentType);
            objectMetadata.setContentDisposition("inline;filename="+objectName);
            PutObjectResult putResult = client.putObject(new PutObjectRequest(bucketName, objectName, inputStream,objectMetadata));
            ret = putResult.getETag();
        }catch (OSSException oe){
            log.error("捕获一个OSSException,这意味着您的请求已发送到OSS,但由于某种原因以错误响应被拒绝。");
            log.error("错误信息:"+oe.getErrorMessage());
            log.error("错误代码:"+oe.getErrorCode());
            log.error("请求ID:"+oe.getRequestId());
            log.error("主机ID:"+oe.getHostId());
        }catch (ClientException ce){
            log.error("捕获了ClientException,这意味着客户机在尝试与OSS通信时遇到了严重的内部问题,例如无法访问网络。");
            log.error("错误信息:"+ce.getErrorMessage());
            ce.printStackTrace();
        }finally {
            log.info(inputStream.hashCode()+"连接关闭");
            client.shutdown();
            inputStream.close();

        }
        return ret;
    }

    /**
     * @author: zzx
     * @date: 2018-12-05 16:26
     * @param FilenameExtension 文件后缀
     * @deprecation: 判断OSS服务文件上传时文件的contentType,只对图片格式放行
     * @return: 默认图片格式
    */
    public static String getContentTypeForImg(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            return "image/bmp";
        }else if (FilenameExtension.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }else if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            return "image/jpeg";
        }else{
            throw new MyException(ResultEnum.UPLOAD_FILE_TYPE_VIOLATION);
        }
    }

    /**
     * @author: zzx
     * @date: 2018-12-05 16:26
     * @param FilenameExtension 文件后缀
     * @deprecation: 判断OSS服务文件上传时文件的contentType,只对视频格式放行
     * @return: 默认mp4格式
     */
    public static String getContentTypeForVideo(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".mp4")) {
            return "video/mpeg4";
        }else if (FilenameExtension.equalsIgnoreCase(".wmv")) {
            return "video/x-ms-wmv";
        }else if (FilenameExtension.equalsIgnoreCase(".avi")) {
            return "video/avi";
        }else if (FilenameExtension.equalsIgnoreCase(".rm")) {
            return "application/vnd.rn-realmedia";
        }else if (FilenameExtension.equalsIgnoreCase(".rmvb")) {
            return "application/vnd.rn-realmedia-vbr";
        }else{
            throw new MyException(ResultEnum.UPLOAD_FILE_TYPE_VIOLATION);
        }
    }
}

其实文中对于视频和图片分开两个方法,根据具体情况来写,反正也是同样的处理代码

 

关于MyException这个类,只是我自己写的异常处理类。顺带贴上来

package com.deceen.common.utils.myexception;

import com.deceen.common.Enums.ResultEnum;

/**
 * @author: zzx
 * @date: 2018/11/16 15:07
 * @description: 自定义异常
 */
public class MyException extends RuntimeException{

    private Integer code;

    public MyException(Integer code,String msg) {
        super(msg);
        this.code = code;
    }

    public MyException(ResultEnum resultEnum) {
        super(resultEnum.getMessage());
        this.code = resultEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
}

ResultEnum就是个枚举类,code和message,没什么的

 

至于@Slf4j注解,是lombok插件的,有兴趣自己百度哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值