将base64编码图片上传到七牛云

将base64编码图片上传到七牛云

接口说明

为了方便,我将文章内容贴一下。

接口说明

POST /putb64/<Fsize>/key/<EncodedKey>/mimeType/<EncodedMimeType>/crc32/<Crc32>/x:user-var/<EncodedUserVarVal>
Host: upload.qiniup.com
Authorization: UpToken <UpToken>
Content-Type: application/octet-stream

<Base64EncodedFileContent>
参数名称 必填 说明
Fsize 文件大小。支持传入 -1 表示文件大小以 http request body 为准。
EncodedKey 如果没有指定则:如果 uptoken.SaveKey 存在则基于 SaveKey 生产 key,否则用 hash 值作 key。
EncodedMimeType 文件的 MIME 类型,默认是 application/octet-stream。
Crc32 文件内容的 crc32 校验值,不指定则不进行校验。
Host upload.qiniup.com(华东区域加速上传域名) ,不同区域的http 和 https 域名详见不同存储区域对应的上传域名
UpToken 上传凭证,需要自行使用七牛算法单独构造生成,具体参考文档上传凭证

返回包:

200 OK {
  hash: <ETag>
}

通过javascript方式上传,javascript代码:

function putb64(){
  var pic = "填写你的base64后的字符串";
  var url = "http://upload.qiniup.com/putb64/20264"; //非华东空间需要根据注意事项 1 修改上传域名
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange=function(){
    if (xhr.readyState==4){
      document.getElementById("myDiv").innerHTML=xhr.responseText;
    }
  }
  xhr.open("POST", url, true);
  xhr.setRequestHeader("Content-Type", "application/octet-stream");
  xhr.setRequestHeader("Authorization", "UpToken 填写你从服务端获取的上传token");
  xhr.send(pic);
}

注意事项:

上传后并指定自定义的 key:http://upload.qiniup.com/putb64/12345/key/usxxeigng=

通过java后台方式上传

import java.io.File;
import java.io.FileInputStream;
import com.qiniu.util.*;
import okhttp3.*;
public class put64 {
    String ak = "";
    String sk = "";    // 密钥配置
    Auth auth = Auth.create(ak, sk);    // TODO Auto-generated constructor stub 
    String bucketname = "";    //空间名
    String key = "";    //上传的图片名

    public String getUpToken() {        
        return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));
    }    
    public void put64image() throws Exception {
        String file = "D:\\Documents\\Pictures\\1.png";//图片路径
        FileInputStream fis = null;        
        int l = (int) (new File(file).length());        
        byte[] src = new byte[l];
        fis = new FileInputStream(new File(file));
        fis.read(src);
        String file64 = Base64.encodeToString(src, 0);
        String url = "http://upload.qiniup.com/putb64/" + l+"/key/"+ UrlSafeBase64.encodeToString(key);      
   //非华东空间需要根据注意事项 1 修改上传域名
        RequestBody rb = RequestBody.create(null, file64);
        Request request = new Request.Builder().
                url(url).
                addHeader("Content-Type", "application/octet-stream")
                .addHeader("Authorization", "UpToken " + getUpToken())
                .post(rb).build();
        System.out.println(request.headers());

        OkHttpClient client = new OkHttpClient();
        okhttp3.Response response = client.newCall(request).execute();
        System.out.println(response);
    }   
     public static void main(String[] args) throws Exception {   
          new put64().put64image();
    }
}

亲测

创建一个测试类实现一下

  • pom.xml引入: <qiniu.version>[7.2.0, 7.2.99]</qiniu.version>
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>${qiniu.version}</version>
</dependency>

测试类:

public class put64 {
    String ak = "GU***";
    String sk = "gNhQ***";    // 密钥配置
    Auth auth = Auth.create(ak, sk);    
    String bucketname = "image";    //空间名
    String key = "20190226";    //上传的图片名

    public String getUpToken() {
        return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));
    }

    public void put64image() throws Exception {
        String file = "D:\\微信截图_20181207104548.png";//图片路径
        FileInputStream fis = null;
        int l = (int) (new File(file).length());
        byte[] src = new byte[l];
        fis = new FileInputStream(new File(file));
        fis.read(src);
        // 将图片解码为Base64编码图片
        String file64 = Base64.encodeToString(src, 0);

        String url = "http://upload.qiniup.com/putb64/" + -1+"/key/"+ UrlSafeBase64.encodeToString(key);  
        //非华东空间需要根据注意事项 1 修改上传域名
        RequestBody rb = RequestBody.create(null, base64Txt());
        Request request = new Request.Builder().
                url(url).
                addHeader("Content-Type", "application/octet-stream")
                .addHeader("Authorization", "UpToken " + getUpToken())
                .post(rb).build();
        System.out.println(request.headers());
        OkHttpClient client = new OkHttpClient();
        okhttp3.Response response = client.newCall(request).execute();
        System.out.println(response);
    }

    /**
     * 对字节数组字符串进行Base64解码并生成图片
     * @param imgStr
     * @param imgFilePath
     * @return
     */
    public static boolean Base64ToImage(String imgStr, String imgFilePath) { 
        if (imgStr == null || imgStr == "") // 图像数据为空
            return false;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// 调整异常数据
                    b[i] += 256;
                }
            }
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            return false;
        }

    }

    public static String base64Txt() throws Exception { // 对字节数组字符串进行Base64解码并生成图片

        String pathname = "D:\\image.txt"; // 绝对路径或相对路径都可以,这里是绝对路径,写入文件时演示相对路径
        File filename = new File(pathname); // 要读取以上路径的input。txt文件
        InputStreamReader reader = new InputStreamReader(
                new FileInputStream(filename)); // 建立一个输入流对象reader
        BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言
        String line = "";
        line = br.readLine();
        return line;

    }


    public static void main(String[] args) throws Exception {
        new put64().put64image();
        //image.txt 这里存放的base64编码   如果将编码直接用String接收,会报字符串过长的错误
        String pathname = "D:\\image.txt"; // 绝对路径或相对路径都可以,这里是绝对路径,写入文件时演示相对路径
        File filename = new File(pathname); // 要读取以上路径的input。txt文件
        InputStreamReader reader = new InputStreamReader(
                new FileInputStream(filename)); // 建立一个输入流对象reader
        BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言
        String line = br.readLine();
        Base64ToImage(line,"D:\\backgroud1.jpg");
    }
}

参考文献

发布了58 篇原创文章 · 获赞 64 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_35098526/article/details/87969520