关于阿里云文件上传

首先申请阿里云OSS 获取到阿里云OSS的endpoint,keyid,keysecret三个属性。废话不说,直接上代码!!!

aliyun:
  oss:
    file:
      bucketname: 
      endpoint: 
      keyid: 
      keysecret: 
/**
 * @author sjsp
 * @title UploadController
 * @createTime 2022/3/25 14:20
 * @Description TODO
 */

import com.xym.utils.oss.AliYunOssUtil;
import com.xym.utils.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.Objects;

/**
 * 公共开放接口
 */
@Slf4j
@Api(tags = "公共开放接口")
@RestController
@RequestMapping("/file")
public class UploadController{

    /**
     * 公共图片上传
     * @param multipartFile
     * @return
     */
    @ApiOperation(value = "公共图片上传")
    @PostMapping("/uploadOssFile")
    public Result uploadObject(@RequestPart("file") MultipartFile multipartFile){
        Date dt=new Date();
        String year=String.format("%tY", dt);
        String month=String .format("%tm", dt);
        String date=String .format("%td", dt);
        String disName = year + "/" + month + "/" + date + "/";
        String url = AliYunOssUtil.uploadObject2OSS(multipartFile, disName);
        if (Objects.isNull(url)){
            return Result.failed("============上传图片失败!================");
        }
        return Result.success("图片上传成功",url);
    }

}
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.xym.utils.ConstantPropertiesUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;

@Component
public class AliYunOssUtil {

    private static final Logger LOG = LoggerFactory.getLogger(AliYunOssUtil.class);
    private static OSSClient client=null;

    private static String ENDPOINT = ConstantPropertiesUtils.END_POIND;
    private static String ACCESS_KEY_ID = ConstantPropertiesUtils.ACCESS_KEY_ID;
    private static String ACCESS_KEY_SECRET = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
    private static String bucketName = ConstantPropertiesUtils.BUCKET_NAME;


    /**
     * 获取阿里云OSS客户端对象
     * */
    public static final OSSClient getOSSClient(){
        return (OSSClient)new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
    }

    /**
     * 新建Bucket  --Bucket权限:私有
     * @param bucketName bucket名称
     * @return true 新建Bucket成功
     * */
    public static final boolean createBucket(OSSClient client, String bucketName){
        Bucket bucket = client.createBucket(bucketName);
        return bucketName.equals(bucket.getName());
    }

    /**
     * 删除Bucket
     * @param bucketName bucket名称
     * */
    public static final void deleteBucket(OSSClient client, String bucketName){
        client.deleteBucket(bucketName);
        LOG.info("删除" + bucketName + "Bucket成功");
    }

    /**
     * 向阿里云的OSS存储中存储文件  --file也可以用InputStream替代
     * @param file 上传文件
     * @param diskName 文件夹名
     * @return String 唯一MD5数字签名
     * */
    public static final String uploadObject2OSS(MultipartFile file,String diskName) {
        String path = null;
        String url  = null;
        String folder = createFolder(bucketName, diskName);

        // 文件夹名
        try {
            OSSClient client = getOSSClient();
            InputStream is = file.getInputStream();
            String fileName = file.getOriginalFilename();
            //创建上传Object的Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(is.available());
            metadata.setCacheControl("no-cache");
            metadata.setHeader("Pragma", "no-cache");
            metadata.setContentEncoding("utf-8");
            metadata.setContentType("image/jpg");
            metadata.setContentType(getContentType(fileName));
            String  key = UUID.randomUUID().toString().replaceAll("-", "")+fileName.substring(fileName.lastIndexOf("."));
            //上传文件
            client.putObject(bucketName,  folder + key, is, metadata);
            // 设置签名URL过期时间为3600秒(1小时)。
            Date expiration = new Date(System.currentTimeMillis() + 3600 * 24 * 365 *10);
            //解析结果
            path = client.generatePresignedUrl(bucketName, folder + key  , expiration).toString();
            url= path.substring(0, path.lastIndexOf("?"));
            url="https://"+bucketName+".oss-cn-beijing.aliyuncs.com/"+folder+key;
        } catch (Exception e) {
            LOG.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
        }

        return url;
    }

    /**
     * 根据key获取OSS服务器上的文件输入流
     * @param bucketName bucket名称
     * @param diskName 文件路径
     * @param key Bucket下的文件的路径名+文件名
     */
    public static final InputStream getOSS2InputStream( String bucketName, String diskName, String key){
        OSSClient client = getOSSClient();
        OSSObject ossObj = client.getObject(bucketName, diskName + key);
        return ossObj.getObjectContent();
    }

    /**
     * 根据key删除OSS服务器上的文件
     * @param bucketName bucket名称
     * @param diskName 文件路径
     * @param key Bucket下的文件的路径名+文件名
     */
    public static void deleteFile( String bucketName, String diskName, String key){
        OSSClient client = getOSSClient();
        client.deleteObject(bucketName, diskName + key);
        LOG.info("删除" + bucketName + "下的文件" + diskName + key + "成功");
    }

    /**
     * 通过文件名判断并获取OSS服务文件上传时文件的contentType
     *
     * @param fileName 文件名
     * @return 文件的contentType
     */
    public static final String getContentType(String fileName) {
        String fileExtension = fileName.substring(fileName.lastIndexOf(".")+1);
        if ("bmp".equalsIgnoreCase(fileExtension)) {
            return "image/bmp";
        }
        if ("gif".equalsIgnoreCase(fileExtension)) {
            return "image/gif";
        }
        if ("jpeg".equalsIgnoreCase(fileExtension) || "jpg".equalsIgnoreCase(fileExtension) || "png".equalsIgnoreCase(fileExtension)) {
            return "image/jpg";
        }
        if ("html".equalsIgnoreCase(fileExtension)) {
            return "text/html";
        }
        if ("txt".equalsIgnoreCase(fileExtension)) {
            return "text/plain";
        }
        if ("vsd".equalsIgnoreCase(fileExtension)) {
            return "application/vnd.visio";
        }
        if ("ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
            return "application/vnd.ms-powerpoint";
        }
        if ("doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
            return "application/msword";
        }
        if ("xml".equalsIgnoreCase(fileExtension)) {
            return "text/xml";
        }
        return "text/html";
    }

    /**
     * (private)获得指定日期之后一段时期的日期。例如某日期之后3天的日期等。
     * @param origDate 基准日期
     * @param amount 基准日期
     * @param timeUnit 时间单位,如年、月、日等。用Calendar中的常量代表
     * @return
     */
    private static final Date dateAfter(Date origDate, int amount, int timeUnit) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(origDate);
        calendar.add(timeUnit, amount);
        return calendar.getTime();
    }

    /**
     * 创建模拟文件夹
     *
     * param ossClient oss连接
     * param bucketName 存储空间
     * param folder 模拟文件夹名如"qj_nanjing/"
     * return 文件夹名
     */
    public static String createFolder(String bucketName, String folder) {
        // 文件夹名
        final String keySuffixWithSlash = folder;
        // 判断文件夹是否存在,不存在则创建
        OSSClient client = getOSSClient();
        if (!client.doesObjectExist(bucketName, keySuffixWithSlash)) {
            // 创建文件夹
            client.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
            LOG.info("创建文件夹成功");
            // 得到文件夹名
            OSSObject object = client.getObject(bucketName, keySuffixWithSlash);
            String fileDir = object.getKey();
            return fileDir;
        }
        return keySuffixWithSlash;
    }


}

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author : rmq
 * @date : 2021/11/18 15:54
 */
@Component
public class ConstantPropertiesUtils implements InitializingBean {

    //读取配置文件内容

    @Value("${aliyun.oss.file.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.file.keyid}")
    private String keyId;

    @Value("${aliyun.oss.file.keysecret}")
    private String keySecret;

    @Value("${aliyun.oss.file.bucketname}")
    private String bucketName;

    //定义公开静态常量

    public static String END_POIND;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;

    @Override
    public void afterPropertiesSet() throws Exception {
        END_POIND = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值