基于 Java 和 七牛云实现文件上传

476 阅读2分钟

准备工作:

  1. 注册一个七牛云账号
  2. 申请 kodo 对象空间使用
  3. 创建 bucket
  4. 域名 C 记录解析 (如果没有域名的话可以使用七牛云的临时域名)

查看文档:

  1. 打开七牛云的首页:portal.qiniu.com/home

  1. 点击左上角的蓝色按钮,在抽屉中选择【产品与解决方案 > 对象存储 Kodo】

  1. 点击菜单右上角的文档按钮,选择【开发者中心】(developer.qiniu.com/

  1. 点击对象存储,选择 Java SDK (developer.qiniu.com/kodo/1239/j…)。

到这一步,我们就可以阅读到如何使用 Java 进行七牛云上传的资料了。

补充

在日常开发中,我们需要先通读文档,然后再进行代码的编写!

环境准备:

参考:developer.qiniu.com/kodo/1239/j…

基本实现:

  1. 在操作之前,需要提供您的:
  • AccessKey (简称 AK)
  • SecretKey (简称 SK)
  • Bucket (需要上传到的存储空间 (俗称【桶】))
String accessKey = "access key";
String secretKey = "secret key";
String bucket = "bucket name";

Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
System.out.println(upToken);
  1. 客户端上传 - 客户端上传需要:

    1. 给客户端提供一个临时凭据(token)
    2. 客户端带上这个临时凭据上传文件
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
return upToken;
  1. 服务端上传 - 服务端完成全部的上传工作,需要:

    1. 配置上传信息(上传地区,bucket),生成上传对象 uploadManager
    2. 生成临时凭据(token)
    3. 读取本地文件路径
    4. 将本地文件路径, 临时凭据 token,文件对应的 key 交个 uploadManager,调用 uploadManager.put 方法进行上传
    5. 拿到上传的 keyhash进行处理
Configuration cfg = new Configuration(Region.region0());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
UploadManager uploadManager = new UploadManager(cfg);

Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);

Response response = uploadManager.put(localFilePath, key, upToken);

// 这里的 log 是 @Slf4j 的 (logback, log4j 也可以)
log.info("服务器上传成功!bodyString: {}, body: {}", response.bodyString(), response.body());

DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
log.info("key: {}", putRet.key);
log.info("hash: {}", putRet.hash);

优化:

根据七牛云的文档和上述基本实现的苏鲁,我们可以封装一个这样的类: QiniuUpload.java

import com.google.gson.Gson;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.qiniu.storage.Region;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class QiniuUpload {
  private String accessKey = "#{your_access_key}";

  private String secretKey = "#{your_secret_key}";

  private String bucket = "#{your_bucket}";

  private String domain = "#{your_domain_name}";

  /**
   * @method getUploadToken
   * @description 获取上传凭证 (用于客户端直传)
   * @return
   */
  public String getUploadToken() {
    Auth auth = Auth.create(accessKey, secretKey);
    String upToken = auth.uploadToken(bucket);
    return upToken;
  }

  /**
   * @method getOverrideUploadToken
   * @description 获取上传覆盖凭证 (用于客户端直传)
   * @return
   */
  public String getOverrideUploadToken(String key) {
    Auth auth = Auth.create(accessKey, secretKey);
    String upToken = auth.uploadToken(bucket, key);
    return upToken;
  }

  /**
   * @method uploadFile
   * @description 文件上传
   * @param localFilePath 本地文件路径
   * @param key 文件名
   * @return
   * @throws Exception
   */
  public String uploadFile(String localFilePath, String key) throws QiniuException {
    Configuration cfg = new Configuration(Region.region2());
    cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
    UploadManager uploadManager = new UploadManager(cfg);

    String upToken = this.getUploadToken();

    Response response = uploadManager.put(localFilePath, key, upToken);

    log.info("服务器上传成功!bodyString: {}, body: {}", response.bodyString(), response.body());

    DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    log.info("key: {}", putRet.key);
    log.info("hash: {}", putRet.hash);

    return putRet.key;
  }
}

这样,基本的上传功能 Bean 我们就准备好了。