将base64编码图片上传到七牛云
接口说明
- FAQ >对象存储 >上传下载> 如何上传base64编码图片到七牛云
在七牛云FAQ上有一篇文章,讲解的接口的使用
https://developer.qiniu.com/kodo/kb/1326/how-to-upload-photos-to-seven-niuyun-base64-code
为了方便,我将文章内容贴一下。
接口说明
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);
}
注意事项:
- upload.qiniup.com 上传域名适用于华东空间。华北空间使用 upload-z1.qiniup.com,华南空间使用 upload-z2.qiniup.com,北美空间使用 upload-na0.qiniup.com。
- var url = “http://upload.qiniup.com/putb64/20264”;这里的 20264 是图片没经过 base64 处理的原图字节大小。
- xhr.setRequestHeader(“Authorization”, “UpToken 填写你从服务端获取的上传token”);这里的 UpToken 与后面的字符串保留一个空格。后面跟上服务端请求的 token 字符串。
- 获取文件大小的时候,切记要通过文件流的方式获取。而不是通过图片标签然后转换后获取。
- var url = “http://upload.qiniup.com/putb64/20264”;中可以扩展为以下方式:http://upload.qiniup.com/putb64/Fsize/key/EncodedKey/mimeType/EncodedMimeType/x:user-var/EncodedUserVarVal。
-
- 举例:
上传后并指定自定义的 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");
}
}