七牛云上传文件

package com.okancha.utils.uploadimage;

import com.okancha.utils.UUIDUtil;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.persistent.FileRecorder;
import com.qiniu.util.Auth;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.file.Paths;

public class QiNiuYunUploadUtil {

  // 设置需要操作的账号的AK,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
  private static final String ACCESS_KEY = "XXXXXXXXXX";

  // 设置需要操作的账号的SK,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
  private static final String SECRET_KEY = "XXXXXXXXXXXXX";

  // 要上传的空间,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
  private static final String BUCKET = "XXXXXXXXXX";

  // 域名domainOfBucket
  private static final String DOMAIN_OF_BUCKET = "XXXXXXXXXX";

  // 华东是Zone.zone0(),华北是Zone.zone1(),华南是Zone.zone2(),北美是Zone.zoneNa0(), https://developer.qiniu.com/kodo/manual/1671/region-endpoint
  private static final Zone ZONE = Zone.zone2();   // todo


  public static Auth getAuth() {
    return Auth.create(ACCESS_KEY, SECRET_KEY);
  }

  /**
   * 获取上传凭证,https://developer.qiniu.com/kodo/sdk/1239/java#upload-flow
   */
  public static String getUploadCredential() {
    return getAuth().uploadToken(BUCKET);
  }

  /**
   * 构造一个带指定 Region 对象的配置类
   */
  public static UploadManager buildUploadManager() {
    return new UploadManager(new Configuration(ZONE));
  }


  /**
   * 文件上传
   *
   * @param localFilePath 需要上传的文件本地路径
   * @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
   */
  public static String fileUpload(String localFilePath, String fileNameKey) {

    try {

      Response response = buildUploadManager().put(localFilePath, fileNameKey, getUploadCredential());

      MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);

//      DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);  // 解析上传成功的结果

      return buildPublicFileUrl(myPutRet.getKey());  // 返回的图片url

    } catch (Exception ex) {
      ex.printStackTrace();
    }
    return null;
  }

  /**
   * 根据文件名和域名返回图片的url,然后访问url直接就可以看到图片了
   *
   * @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
   */
  public static String buildPublicFileUrl(String fileNameKey) {

    try {

      String encodedFileName = URLEncoder.encode(fileNameKey, "utf-8");
      return String.format("%s/%s", DOMAIN_OF_BUCKET, encodedFileName);

    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    return null;
  }


  /**
   * 私有空间返回文件URL
   *
   * @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
   * @param expireInSeconds 过期时间,私有空间文件的访问链接超时时间,单位(秒)
   */
  public static String buildPrivateFileUrl(String fileNameKey, long expireInSeconds) {

    try {

      return getAuth().privateDownloadUrl(buildPublicFileUrl(fileNameKey), expireInSeconds);

    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }


  /**
   * 字节数组上传文件,然后返回文件的url,然后可以直接在公网上访问url看到文件了
   *
   * @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
   */
  public static String charArrayUpload(String fileNameKey, byte[] uploadBytes) {

    try {

      Response response = buildUploadManager().put(uploadBytes, fileNameKey, getUploadCredential());

//      DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);  // 解析上传成功的结果

      MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);

      return buildPublicFileUrl(myPutRet.getKey());  // 返回的文件url

    } catch (Exception ex) {
      ex.printStackTrace();
    }
    return null;
  }



  /**
   * 断点续传
   *
   * @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
   * @param localFilePath 文件路径, 如果是Windows情况下,格式是 D:\\qiniu\\test.png
   */
  public static String breakPointUpload(String localFilePath, String fileNameKey) {

    try {

      // 如果是Windows情况下,格式是 D:\\qiniu\\test.png
      String localTempDir = Paths.get(System.getenv("java.io.tmpdir"), BUCKET).toString();

      // 设置断点续传文件进度保存目录
      FileRecorder fileRecorder = new FileRecorder(localTempDir);

      // 构造一个带指定Zone对象的配置类
      Configuration cfg = new Configuration(ZONE);
      UploadManager uploadManager = new UploadManager(cfg, fileRecorder);

      Response response = uploadManager.put(localFilePath, fileNameKey, getUploadCredential());

      // 解析上传成功的结果
//      DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

      MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);

      return buildPublicFileUrl(myPutRet.getKey());  // 返回的文件url

    } catch (Exception ex2) {
      ex2.printStackTrace();
    }
    return null;
  }


// 测试
  public static void main(String[] args) {
//    // 上传图片
//    DefaultPutRet defaultPutRet = fileUpload(Zone.zone2(), getUploadCredential(), "D:\\wulin.jpg", "微软微软微软认为");
//    String fileNameKey = defaultPutRet.key; // key是文件名
//
//    String s = buildPublicFileUrl(fileNameKey, "pygx2kf5f.bkt.clouddn.com");  // 返回的图片网址
//    System.out.println("ssss****" + s);

    String url = fileUpload("D:\\1.jpg", "zhouxiang");
    System.out.println(url);

  }
}

 

 

package com.okancha.utils.uploadimage;

/**
 * 官方说:有些情况下,七牛返回给上传端的内容不是默认的hash和key形式,
 * 这种情况下,可能出现在自定义returnBody或者自定义了callbackBody的情况下,
 * 前者一般是服务端直传的场景,而后者则是接受上传回调的场景,这两种场景之下,
 * 都涉及到需要将自定义的回复内容解析为Java的类对象,一般建议在交互过程中,
 * 都采用JSON的方式,这样处理起来方法比较一致,而且JSON的方法最通用。
 * 详情:https://developer.qiniu.com/kodo/sdk/1239/java#server-upload
 * ctrl+f 输入关键字搜索:解析自定义回复内容
 */
public class MyPutRet {

  public String key;

  public String hash;

  public String bucket;

  public long fsize;

  public String getKey() {
    return key;
  }

  public void setKey(String key) {
    this.key = key;
  }

  public String getHash() {
    return hash;
  }

  public void setHash(String hash) {
    this.hash = hash;
  }

  public String getBucket() {
    return bucket;
  }

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

  public long getFsize() {
    return fsize;
  }

  public void setFsize(long fsize) {
    this.fsize = fsize;
  }
}

 

你可能感兴趣的:(Java,各种工具类,七牛云,图片上传)