java七牛云sdk本地上传Springboot示例

故事扮演 提交于 2020-04-06 04:00:28

依赖解决:

1.七牛云的Java SDK从7.2.24开始要求Java1.8及以上(因为依赖的okhttp3 升级到 3.14.2,不支持jdk7),官方提示:若一定 java 1.7 ,请手动指定 okhttp3 依赖 3.12,要求 3.12.3 及以上, com.squareup.okhttp3:okhttp:3.12.3。如果是用jdk8可以直接跳到使用示例。

咱们先看一下SDK7.2.23的依赖:

    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>3.11.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.5</version>
      <scope>compile</scope>
    </dependency>

这里本人亲测,7.2.23版本所依赖的okhttp:3.11.0现在依然可用,如果我们想用更高版本的okhttp可以通过先排除低版本依赖再导入高版本依赖的方式解决:

        <!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.2.23</version>
            <exclusions><!-- 排除低版本的okhttp依赖 -->
                <exclusion>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.12.10</version>
        </dependency>

推荐用以上方式使用最新依赖,当然我们也可以简单粗暴直接修改maven本地的qiniu-java-sdk-7.2-23.pom文件指定okhttp的更高版本解决。

使用示例:

1.配置文件

# 七牛云配置
# bucket是创建的存储空间名
# path对应存储空间的访问域名
qiniu:
  accessKey: xxxxxx
  secretKey: xxxxxx
  bucket: xxxxxxx
  path: https://cdn.xxxxx.com

2.读取配置

@Component
@ConfigurationProperties(prefix = "qiniu")
public class QiniuConfig {

    private String accessKey;

    private String secretKey;

    private String bucket;

    private String path;

    public String getAccessKey() {
        return accessKey;
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public String getSecretKey() {
        return secretKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    public String getBucket() {
        return bucket;
    }

    public void setBucket(String bucket) {
        this.bucket = bucket;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }
}

3.通用结果返回类

/**
 * @Description 通用返回结果集
 */
public class ResultMap extends HashMap<String, Object> {
    public ResultMap() {
        put("state", true);
        put("code", 0);
        put("msg", "success");
    }

    public static ResultMap error(int code, String msg) {
        ResultMap r = new ResultMap();
        r.put("state", false);
        r.put("code", code);
        r.put("msg", msg);
        return r;
    }

    public static ResultMap error(String msg) {
        return error(HttpStatus.METHOD_NOT_ALLOWED.value(), msg);
    }

    public static ResultMap error() {
        return error(HttpStatus.METHOD_NOT_ALLOWED.value(), "未知异常,请联系管理员");
    }

    public static ResultMap ok(String msg) {
        ResultMap r = new ResultMap();
        r.put("msg", msg);
        return r;
    }

    public static ResultMap ok(Map<String, Object> par) {
        ResultMap r = new ResultMap();
        r.putAll(par);
        return r;
    }

    public static ResultMap ok() {
        return new ResultMap();
    }

    public ResultMap put(String key, Object value) {
        super.put(key, value);
        return this;
    }

}

4.编写接口类

public interface QiniuService {

    public ResultMap upToken();

    public ResultMap localUpload(String localFilePath, String key);

}

5.接口实现类

@Service
public class QiniuServiceImpl implements QiniuService {

    @Autowired
    private QiniuConfig qiniuConfig;

    /**
     * 简单上传的凭证
     * 最简单的上传凭证只需要AccessKey,SecretKey和Bucket就可以
     * @return
     */
    @Override
    public ResultMap upToken() {
        Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
        String upToken = auth.uploadToken(qiniuConfig.getBucket());
        Map<String, Object> map = new HashMap<>();
        map.put("upToken",upToken);
        return ResultMap.ok(map);
    }

    /**
     * 服务器端上传本地文件
     * 利用七牛服务端SDK从服务端直接上传文件到七牛云,服务端可以自己生成上传凭证,然后利用SDK中的上传逻辑进行上传,最后从七牛云获取上传的结果
     * @param localFilePath 本地路径 如果是Windows情况下,格式是 D:\\qiniu\\test.png
     * @param key 目标目录+文件名,默认不指定key的情况下,以文件内容的hash值作为文件名
     * @return
     */
    @Override
    public ResultMap localUpload(String localFilePath, String key) {
        if(StringUtils.isEmpty(localFilePath)){
            return ResultMap.error("localFilePath不能为空");
        }
        //构造一个带指定 Region 对象的配置类
        //Configuration cfg = new Configuration(Region.region2());//此行用于最新版本
        Configuration cfg = new Configuration(Zone.zone2());//7.2.23版本用Zone配置地区
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        String accessKey = qiniuConfig.getAccessKey();
        String secretKey = qiniuConfig.getSecretKey();
        String bucket = qiniuConfig.getBucket();

        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
            Response response = uploadManager.put(localFilePath, key, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

            return ResultMap.ok(putRet.key);
        } catch (QiniuException ex) {

            Response r = ex.response;
            return ResultMap.error(r.toString());
        }
    }
}

6.控制器上传

@RestController
public class UploadController {

    @Autowired
    private QiniuService qiniuService;
	 /**
     * 测试上传凭证
     * @return
     */
    @GetMapping("/getToken")
    public ResultMap getToken(){
        return qiniuService.upToken();
    }
    /**
     * 测试上传本地文件
     * @return
     */
    @GetMapping("/localUpLoad")
    public ResultMap localUpLoad() {
        return qiniuService.localUpload("E:\\www\\test.png","test.png");
    }
   
}

7.测试结果示例

  • getToken上传凭证
{"state":true,"code":0,"msg":"success","upToken":"_SgskDI_xxxxxxxxxxxxxxxx"}
  • localUpLoad本地上传
{"state":true,"code":0,"msg":"test.png"}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!