如何上传base64编码图片到七牛云

本文介绍如何使用七牛云的Base64接口上传文件,包括设置上传URL、配置HTTP请求头及发送Base64编码的文件内容。特别关注了文件大小的正确设置、UpToken的使用以及如何通过JavaScript实现文件的上传。

接口说明

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

<Base64EncodedFileContent>
  • <Fsize>: 文件大小,必选。

  • <EncodedKey>: 可选,如果没有指定则:如果 uptoken.SaveKey 存在则基于 SaveKey 生产 key,否则用 hash 值作 key。

  • <EncodedMimeType>: 文件的 MIME 类型。可选,默认是 application/octet-stream。

  • <Crc32>: 文件内容的 crc32 校验值。可选,不指定则不进行校验。

  • Host :上传域名up.qiniu.com 用于服务端上传,upload.qiniu.com 用于客户端的上传

返回包:

200 OK {
  hash: <ETag>
}

通过javascript方式上传:

javascript代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function  putb64(){
   var  pic =  "填写你的base64后的字符串" ;
   var  url =  "http://upload.qiniu.com/putb64/20264" ;
   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);
}

注意事项:

  1. var url = "http://upload.qiniu.com/putb64/20264"; 这里的20264是你的图片的没经过base64处理的原图的字节大小。

  2. xhr.setRequestHeader("Authorization", "UpToken 填写你从服务端获取的上传token"); 这里的UpToken与后面的字符串保留一个空格。后面跟上你在服务端请求的token的字符串。具体你通过什么样子的请求方式获得是客户自己要关心的事情。

  3. 获取文件大小的时候,切记要通过文件流的方式获取。而不是通过图片标签然后转换后获取。

  4. var url = "http://upload.qiniu.com/putb64/20264"; 中可以扩展为以下方式:http://upload.qiniu.com/putb64/Fsize/key/EncodedKey/mimeType/EncodedMimeType/x:user-var/EncodedUserVarVal

  • Fsize: 文件大小,必选。支持传入 -1 表示文件大小以 http request body 为准。

  • EncodedKey: 可选,如果没有指定则:如果 uptoken.SaveKey 存在则基于 SaveKey 生产 key,否则用 hash 值作 key。

  • 整个EncodedKey需要经过base64编码!!!

  • 如:


  • var key  =  uuid() ;
    key = base64encode(key) ;
    var url = 'http://upload.qiniu.com/putb64/-1/key/'+key

  • 具体可以参照: http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64

  • EncodedMimeType: 文件的 MIME 类型。可选,默认是 application/octet-stream。

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

在前端实现七牛云Base64 文件上传,且无需后端协助的情况下,可以通过七牛云 JavaScript SDK 结合 Base64 数据上传的方式完成操作。以下是实现的关键步骤和注意事项: ### 1. 获取上传凭证 (Token) 通常情况下,七牛云上传需要一个上传凭证(Token),用于授权上传操作。然而,在完全前端实现的场景中,可以采用**临时上传凭证**或者**公共写入权限**的存储空间(Bucket)来实现无需后端协助的上传。 - **公共写入 Bucket**:如果业务允许,可以配置一个公共写入权限的 Bucket,这样上传时无需 Token,但这种方式存在安全风险,建议仅用于测试环境。 - **临时 Token 获取**:也可以通过后端提供一个临时 Token 获取接口,但在当前场景中假设无法获得后端支持,因此需依赖其他方式。 ### 2. Base64 文件上传实现 七牛云 SDK 支持直接上传 Base64 编码的数据。上传时需注意以下几点: - **文件名编码**:七牛云要求上传的文件名需为 Base64 编码格式,否则可能导致上传失败。因此,上传时需对文件名进行 `btoa()` 编码。 - **使用 JavaScript SDK**:七牛云提供了 JavaScript SDK(Qiniu.js),可直接在前端使用。 #### 示例代码 ```html <script src="https://cdn.jsdelivr.net/npm/qiniu-js@2.5.0/dist/qiniu.min.js"></script> <script> // 假设已有 Base64 数据(去除 data:image/png;base64, 部分) const base64Data = 'iVBORw0KGgoAAAANSUhEUgAAAGQAAAA...'; // 七牛云上传配置(若 Bucket 为公共写入,可不传 token) const config = { useCdnDomain: true, region: qiniu.region.z0 }; // 生成唯一的文件名并进行 Base64 编码 const fileName = 'image-' + Date.now() + '.png'; const encodedFileName = btoa(fileName); // 初始化上传参数 const observable = qiniu.upload(base64Data, encodedFileName, null, { mimeType: ['image/png', 'image/jpeg', 'image/gif'] }, config); // 上传结果监听 const observer = { next(res) { console.log('上传进度:', res.total.percent); }, error(err) { console.error('上传失败:', err); }, complete(res) { console.log('上传成功:', res); // res.key上传后的文件名 } }; // 开始上传 observable.subscribe(observer); </script> ``` ### 3. 安全性与注意事项 - **Token 安全性**:如前所述,若无法获取 Token,则需使用公共写入 Bucket,但这种方式存在数据泄露或被滥用的风险,不建议在生产环境中使用。 - **文件名编码**:上传文件名必须进行 Base64 编码,否则可能导致上传失败[^2]。 - **跨域问题**:确保七牛云的 Bucket 配置了正确的 CORS 规则,以支持前端跨域上传请求。 ### 4. 上传成功后的处理 上传成功后,七牛云会返回一个 `key`,即文件名。通过拼接七牛云的访问域名和该文件名,即可获得文件的访问地址,例如: ```javascript const domain = 'https://yourdomain.com/'; const fileUrl = domain + encodedFileName; ``` ### 5. 适用场景 此方法适用于小型文件(如用户头像、小图等)的上传需求,不适合大文件或频繁上传的场景,因为 Base64 数据体积较大,且上传过程可能影响页面性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值