OSS文件上传

OSS文件上传

基于springboot 项目做 :
配置文件中加入:

spring.servlet.multipart.max-file-size=15MB
spring.servlet.multipart.max-request-size=15MB
uposs.allowed-file-size-max=2MB
uposs.allowed-file-suffix=PNG,JPG,JPEG
uposs.aliyun.oss.endpoint=oss-cn-beijing.aliyuncs.com
uposs.aliyun.oss.bucketName=hzx-weishu
uposs.aliyun.oss.accessKeyID=LTAI5t9wkfTMvJuVxUEevHpK
uposs.aliyun.oss.accessKeySecret=n2cSXyT27Qqk0eBETSnSxRJpYLa93O

工具类:

/**
 * 文件大小校验工具类
 *
 * @author awg
 * @date 2020/10/27 星期二
 */
public class FileUtil {

    /**
     * 校验文件大小是否合法 (true-合法, false-不合法)
     *
     * @param file 需要校验的文件
     * @param maxFileSizeStr 单个文件上传的最大值的字符串表示(如10MB)
     * @return 校验文件大小的结果 (true-合法, false-不合法)
     */
    public static boolean fileSizeJudge(MultipartFile file, String maxFileSizeStr) {
        // 先获取配置文件中的设置的单个文件的大小
        if (Objects.isNull(file) || !StringUtils.hasLength(maxFileSizeStr)) {
            throw new IllegalArgumentException("缺少必要的参数");
        }
        /*
         * 转换
         */
        // 文件大小的数值: 如10MB的10, 最终要转换成字节数进行比较
        long num = Long.parseLong(maxFileSizeStr.split("[A-Z]{2,4}")[0]);
        // 文件大小的单位: 如10MB的MB
        String unit = maxFileSizeStr.substring(String.valueOf(num).length()).toUpperCase();
        // 文件大小转为字节
        switch (unit) {
            case "BYTE":
                break;
            case "KB":
                num = num * 1024;
                break;
            case "MB":
                num = num * 1024 * 1024;
                break;
            case "GB":
                num = num * 1024 * 1024 * 1024;
                break;
            case "TB":
                num = num * 1024 * 1024 * 1024 * 1024;
                break;
            default:
                num = 0L;
                break;
        }
        return file.getSize() <= num;
    }

    /**
     * 获取文件的内容类型
     *
     * @param suffix 文件后缀名(包括.)
     * @return 文件的内容类型
     */
    public static String getContentType(String suffix) {
        // 文件的内容类型,默认为纯文本格式(text/plain)
        String contentType;
        switch (suffix.toLowerCase()) {
            case ".bmp":
                contentType = "image/bmp";
                break;
            case ".gif":
                contentType = "image/gif";
                break;
            case ".png":
            case ".jpg":
            case ".jpeg":
                contentType = "image/jpeg";
                break;
            case ".html":
                contentType = "text/html";
                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 ".pdf":
                contentType = "application/pdf";
                break;
            default:
                contentType = "text/plain";
                break;
        }
        return contentType;
    }

}
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.Objects;
import java.util.UUID;


/**
 * OSS工具类 - 阿里云OSS服务器工具类
 *
 * @author awg
 * @date 2020/10/26
 */
@Component
public class OssUtil {

    /*
     * 从配置文件获取阿里云OSS的相关配置
     */
    /**
     * 阿里云OSS的地域节点
     */
    @Value("${uposs.aliyun.oss.endpoint}")
    private String endpoint;

    /**
     * 阿里云OSS的存储空间名称
     */
    @Value("${uposs.aliyun.oss.bucketName}")
    private String bucketName;

    /**
     * 阿里云OSS的访问秘钥ID
     */
    @Value("${uposs.aliyun.oss.accessKeyID}")
    private String accessKeyID;

    /**
     * 阿里云OSS的访问秘钥凭证
     */
    @Value("${uposs.aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    /**
     * 阿里云OSS的存储空间的上传文件的存储目录
     */
//    @Value("${uposs.aliyun.oss.uploadSaveDir}")
//    private String uploadSaveDir;

    /**
     * 上传文件
     *
     * @param file 上传的文件
     * @return 上传成功之后文件的URL路径
     * @throws IOException IO异常
     */
    public String uploadFile(MultipartFile file) throws IOException {
        //上传图片到OSS
        String fileUrl = uploadImg2OSS(file);
        //获取上传图片到OSS之后的URL路径
        String str = getURL(fileUrl);
        return str.trim();
    }

    /**
     * 上传图片到OSS
     *
     * @param file 上传的文件
     * @return 上传文件的新的名称
     * @throws IOException IO异常
     */
    @SuppressWarnings("deprecation")
    private String uploadImg2OSS(MultipartFile file) throws IOException {
        // 1.生成新的文件名称(以防止文件名称重复)
        String fileName = file.getOriginalFilename();
        String suffix = Objects.requireNonNull(fileName).substring(fileName.lastIndexOf(".")).toLowerCase();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String lastName = uuid + suffix;

        // 2.上传文件到OSS
        InputStream inputStream = file.getInputStream();
        // 2.1创建上传的Object的metadata
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(inputStream.available());
        objectMetadata.setCacheControl("no-cache");
        objectMetadata.setHeader("Pragma", "no-cache");
        objectMetadata.setContentType("image/jpg");
        objectMetadata.setContentType(FileUtil.getContentType(lastName.substring(lastName.lastIndexOf("."))));
        objectMetadata.setContentDisposition("inline;filename=" + lastName);
        // 2.2上传文件
        OSSClient ossClient = new OSSClient(endpoint, accessKeyID, accessKeySecret);
        ossClient.putObject(bucketName,  lastName, inputStream, objectMetadata);
        inputStream.close();
        return lastName;
    }

    /**
     * 获得URL链接
     *
     * @param lastName 上传文件的新的名称
     * @return 文件上传成功之后文件的URL路径
     */
    @SuppressWarnings("deprecation")
    private String getURL(String lastName) {
        // 设置URL的过期时间为20年, 即: 20*365*24*60*60*1000L 毫秒
        Date expiration = new Date(new Date().getTime() + 20*365*24*60*60*1000L);
        // 生成URL
        OSSClient ossClient = new OSSClient(endpoint, accessKeyID, accessKeySecret);
        URL url = ossClient.generatePresignedUrl(bucketName, lastName, expiration);
        // 去除URL的参数
        String tmp = url.toString().split("\\?")[0];
        int index = tmp.lastIndexOf("/") + 1;
        return tmp.substring(0, index)  + tmp.substring(index);
    }



}


controller层

@RestController
@RequestMapping("/ossUpload")
public class OssUploadController {

    @Autowired
    OssUtil ossUtil;

    @RequestMapping("/upload")
    public String upload(MultipartFile file) throws IOException {
        String fileUrl = ossUtil.uploadFile(file);
        return fileUrl;
    }
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值