SpringBoot上传头像之七牛云oss

UploadController

@RestController
public class UploadController {

    @Autowired
    private UploadService uploadService;

    //头像上传接口
    @PostMapping("/upload")
    public ResponseResult uploadImg(MultipartFile img){
        return uploadService.uploadImg(img);
    }

}

UploadServiceImpl

package com.mrs.service.impl;

import com.google.gson.Gson;
import com.mrs.common.ResponseResult;
import com.mrs.common.enums.AppHttpCodeEnum;
import com.mrs.exception.SystemException;
import com.mrs.service.UploadService;
import com.mrs.utils.PathUtils;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * description: UploadServiceImpl
 * date: 2022/8/10 22:15
 * author: MR.孙
 */
@Service
@Data
@ConfigurationProperties(prefix = "oss")
public class UploadServiceImpl implements UploadService {

    /**
     * @description:  头像上传
     * @param img
     * @return: com.mrs.common.ResponseResult
     * @author: MR.孙
     * @date: 2022/8/10 22:16
    */
    @Override
    public ResponseResult uploadImg(MultipartFile img) {

        //判断文件类型
        //获取原始文件名
        String originalFilename = img.getOriginalFilename();
        //对原始文件名进行判断
        if(!originalFilename.endsWith(".png")){
            throw new SystemException(AppHttpCodeEnum.FILE_TYPE_ERROR);
        }

        //如果判断通过上传文件到OSS
        String filePath = PathUtils.generateFilePath(originalFilename);
        String url = uploadOss(img,filePath);
        return ResponseResult.okResult(url);
    }

    private String accessKey;
    private String secretKey;
    private String bucket;
    private String urlPrefix;

    private String uploadOss(MultipartFile imgFile, String filePath) {
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        
        String key = filePath;//   2022/8/11/filename.png
        try {
            // byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8");
            // ByteArrayInputStream byteInputStream = new ByteArrayInputStream(uploadBytes);
            InputStream inputStream = imgFile.getInputStream();

            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);
            try {
                Response response = uploadManager.put(inputStream, key, upToken, null, null);
                //解析上传成功的结果
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                System.out.println(putRet.key);
                System.out.println(putRet.hash);
                return urlPrefix+key;
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (Exception ex) {
            //ignore
        }
        return "文件上传七牛云oss失败,请重新尝试";
    }
}


PathUtils
用于生成上传到七牛云的目录+文件名的形式:2022/8/11/filename.png

public class PathUtils {

    public static String generateFilePath(String fileName){
        //根据日期生成路径   2022/1/15/
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
        String datePath = sdf.format(new Date());
        //uuid作为文件名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        //后缀和文件后缀一致
        int index = fileName.lastIndexOf(".");
        // test.jpg -> .jpg
        String fileType = fileName.substring(index);
        return new StringBuilder().append(datePath).append(uuid).append(fileType).toString();
    }
}

//默认不指定key的情况下,以文件内容的hash值作为文件名
//key,不仅可以指定文件名,还可以指定目录+文件名的形式 2022是一个目录是根据 / 区分的

filePath就是PathUtils生成的七牛云文件路径

urlPrefix就是就是文件外链的临时域名,最后的文件外链就是由临时域名+文件名

yml

 oss:
   accessKey: zhbshfaolSddWY-rNts8x293U_Zu5t0G47BaNs-V
   secretKey: KOjhpebuEDqQPZb-ijA96I0WTvlhwWlfq-As6VrD
   bucket: slzgg666
   urlPrefix: http://rgeeq1n4k.hn-bkt.clouddn.com/

测试

posted @ 2022-08-11 12:33  长情c  阅读(58)  评论(0)    收藏  举报