背景介绍

  • 使用JS将APP(包括安卓和IOS)上传到七牛 (上传APP所以不考虑数据处理)

  • uptoken使用JAVA后台得到

  • 七牛上传基于plupload下面不详述如何使用参见

  • 七牛上传的简单案例也不详述,参见官网事例很清楚了。就是参数一定看仔细!

  • 清除缓存问题

  • IOS APP上传icon和ipa自动生成plist

  • 补充:限制选择文件类型;打开多个选择文件窗口

踩过的坑

uptoken获得失败

1.使用前端获取:
本人是个前端,在后台还没给出获取uptoken接口时,我先选择了使用JS(uptoken_func参数)获取进行测试,代码如下:详细参见

    // uptoken_func: function (file) {    // 在需要获取uptoken时,该方法会被调用/*** 上传凭证算法实现参考* 请注意External Resources项中引用的第三方CryptoJS库*/var genUpToken = function(accessKey, secretKey, putPolicy) {//SETP 2var put_policy = JSON.stringify(putPolicy);//SETP 3var encoded = base64encode(utf16to8(put_policy));//SETP 4var hash = CryptoJS.HmacSHA1(encoded, secretKey);var encoded_signed = hash.toString(CryptoJS.enc.Base64);//SETP 5var upload_token = accessKey + ":" + safe64(encoded_signed) + ":" + encoded;console && console.log("upload_token=", upload_token)return upload_token;// }

费了半天劲,又是引入CryptoJS,又是加入utf16to8等等方法,最后还是失败了,生成了一个uptoken我用来上传文件上传失败,就问七牛工单,他说uptoken过时或者错误,这就没法搞了也不知道为什么错,就在没有头绪的时候后台接口好了,得,用后台接口,结束!(有童鞋用JS获取了uptoken的可以来交流)
不过在错误中学习到了uptoken的第三个值(用“:”分割的aaaa:aaaa:aaaa)可以通过base64解码得到上传策略。

2.使用后台获取(我选择的是java)
导入gson-1.6.jar和qiniu-java-sdk-7.0.0.jar,以下是qiniu的方法!是用uptoken,传入需要的参数既可以获得,本人不做后台开发就不详述,就是一定注意参数不要传错了,我们搞了好久AK,SK复制错了,如果提示uptoken错误多检查几遍参数。到此完成了一个最简单的上传。图片描述

4M以上大文件上传失败

奇葩一样的大坑啊,本来就是刚刚上手qiniu还没搞懂的时候还在郁闷昨天还好好的怎么过了一晚就上传失败了,查询资料,全不费功夫社区有人踩过了。看第二个评论,简单说就是设置uptoken参数不能上传大文件,必须设置uptoken_url才行,作者说的第一个方法我进不去,就没有纠结。这个是qiniu的bug!

你直接看源码就知道它在判断需要分块的时候,js-sdk内部设置up.setOption的调用getUptoken(),that.tokenInfo在只填写token的时候,还是undefined,所以就出问题了。
因为tokenInfo是在走getNewUpToken()设置的,而getNewUpToken是走填了url才会执行的函数。

覆盖已有文件

刚刚拿到需求,思索一番,

  • 方案一:生成一个可用覆盖文件的uptoken;

  • 方案二:qiniuJSjdk通过配置参数可以覆盖文件。

查阅API,社区资料,发现方案一可以行的通,只需后台uptoken方法时传入key参数即可覆盖服务器上面的key文件。
我原以为key也是后台给设定的存储文件名,(这个key并不是服务器存储的最终文件名)后来才发现不是,详细看scope参数。

指定上传的目标资源空间 Bucket 和资源键 Key(key的长度最大为750字节)。有两种格式:
●<bucket>,表示允许用户上传文件到指定的 bucket。在这种格式下文件只能新增,若已存在同名资源上传则会失败。
●<bucket>:<key>,表示只允许用户上传指定 key的文件。在这种格式下文件默认允许修改,若已存在同名资源则会被覆盖。如果只希望上传指定 key 的文件,并且不允许修改,那么可以将下面的insertOnly 属性值设为 1。

由于后台需要key,所以前台在uptoken_url时传参,例如:'/appstore/app/qiniuUploadToken?params=a.png'。

关于文件名

前台有三个参数和文件名有关:

// unique_names: true,              // 默认false,key为文件名。若开启该选项,JS-SDK会为每个文件自动生成key(文件名)
// save_key: true,                  // 默认false。若在服务端生成uptoken的上传策略中指定了sava_key,则开启,SDK在前端将不对key进行任何处理
'Key': function (up, file) {// 若想在前端对每个文件的key进行个性化处理,可以配置该函数// 该配置必须要在unique_names: false,save_key: false时才生效var key = file.name;//**错误**// do something with key herereturn key}

重点看第三个参数,当时没有在意就这样写的,所以认为给后台传的key就是服务器存储的文件名,其实不然,是我在JS key中设置了var key = file.name。应该需要前端定一个名字,而不是文件原名。

清除缓存问题

看官方文档给出如下解决方法,生成管理token,清除缓存。
但是客服给出了更好的解决方案

一、URL 问号传参刷新:
二、在七牛云存储上刷新: 1、登录portal.qiniu.com 2、工具刷新 3、API 接口文档刷新:
三、只使用fusion cdn加速,且没有使用七牛存储

我选择了最简单的第一种,URL 问号传参。(抛出问题:ios app是ipa url问号传参,还是plisturl问号传参,还是都需要,待测试验证,之后更新!)

例如,如果 http://7xt44n.com2.z0.glb.qin...
这个图片资源没有更新, 可以在该 URL 后面加上参数的形式来让 CDN
强制刷新:http://7xt44n.com2.z0.glb.qin...,CDN
拿到这个 URL 后会强制回七牛的存储中取回最新的资源。

原理: (用户创建空间为普通平台,在这个平台下 url 是完整缓存的。也就是说。如果你带了? 1234 这样的查询参数在文件 url
后面,就变成了不同的 url,所以不会命中 cdn 的缓存。会去原站七牛拉资源,这时候拉取到的资源就变成了覆盖更新后的资源了。)

IOS APP上传icon和ipa自动生成plist

原先的ios部署非常不方便,需要上传icon和ipa得到地址后修改plist,再上传plist。所以就想能不能做到自动。
还是喜欢先查阅资料看看网上有没有方案,一无所获。
方案如下:(以下代码感谢导师的支持)

  1. 使用Arttemplate得到一个模板

  2. 使用blob得到一个blob数据用于生成file对象

  3. 使用七牛的表单上传,结合XMLHttpRequest,formData得到一个表单数据
    详细代码:

function plist(icon57Url, icon512Url, ipaUrl, key,plistUrl) {var data = {icon57Url: icon57Url,icon512Url: icon512Url,ipaUrl: ipaUrl,};var html = template('test', data);var blob = new Blob([html], {type: "text/plain"});//document.getElementById('content').innerHTML = html;var Qiniu_UploadUrl = "http://up.qiniu.com";var Qiniu_upload = function (f, token) {var xhr = new XMLHttpRequest();xhr.open('POST', Qiniu_UploadUrl, true);var formData, startDate;formData = new FormData();//if (key !== null && key !== undefined) formData.append('key', key);formData.append('token', token);formData.append('name', key + '.plist');formData.append('chunk', 0);formData.append('chunks', 1);formData.append('key', key + '.plist');formData.append('file', f, key + '.plist');var taking;xhr.upload.addEventListener("loadstart", function (up, file) {/*up.settings.multipart_params = {filename : "xucheng.docx"};*/}, false);xhr.upload.addEventListener("progress", function (evt) {if (evt.lengthComputable) {/*var nowDate = new Date().getTime();taking = nowDate - startDate;var x = (evt.loaded) / 1024;var y = taking / 1000;var uploadSpeed = (x / y);var formatSpeed;if (uploadSpeed > 1024) {formatSpeed = (uploadSpeed / 1024).toFixed(2) + "Mb\/s";} else {formatSpeed = uploadSpeed.toFixed(2) + "Kb\/s";}*///var percentComplete = Math.round(evt.loaded * 100 / evt.total);//progressbar.progressbar("value", percentComplete);// console && console.log(percentComplete, ",", formatSpeed);}}, false);xhr.onreadystatechange = function (response) {if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText != "") {var blkRet = JSON.parse(xhr.responseText);Compost('/appstore/app/updateOneProperty',{'id':datascope.appid,'ios_url':plistUrl},function () {$('#ios_url').textbox('setText', plistUrl);})console.log("plist上传成功")} else if (xhr.status != 200 && xhr.responseText) {}};startDate = new Date().getTime();$("#progressbar").show();xhr.send(formData);};/*var reader = new window.FileReader();reader.readAsDataURL(blob);reader.onloadend = function() {var base64data = reader.result;console.log(base64data);}*/$.ajax({type: "get",url: "/appstore/app/qiniuUploadToken?params=" + key + ".plist",async: true,dataType: "json",success: function (data) {var token = data.uptoken;console.log(token);Qiniu_upload(blob, token);}});
}

到此最重要的一步自动上传plist完成!,以此共同学习。

补充

限制选择文件类型

plupload插件支持,ipa和apk都是zip类型,所以title是Zip files

filters: {mime_types: [{title: "Image files", extensions: "png"}, //限定png后缀上传{title: "Zip files", extensions: "ipa"}, //限定ipa后缀上传{title: "Zip files", extensions: "apk"}, //限定apk后缀上传]},

打开多个选择文件窗口

每次实例化option方法时会( browse_button: *// 上传选择的点选按钮,必需)给按钮绑定一个点击事件,所以之后会点击打开多次选择文件窗口。
尝试解决方案(失败):销毁option对象,销毁对象绑定的事件不会删除
销毁绑定事件,由于没有事件名称所以无法删除
尝试解决方案(成功):

 if (uploader) {uploader.disableBrowse(true);}

七牛 js JDK使用 - 上传APP 1相关推荐

  1. 七牛 js JDK使用 - 上传APP

    [整理whh-原文地址] 背景介绍 使用JS将APP(包括安卓和IOS)上传到七牛 (上传APP所以不考虑数据处理) uptoken使用JAVA后台得到 七牛上传基于plupload下面不详述如何使用 ...

  2. elementui 上传七牛_element ui使用上传组件上传文件到七牛(qiniu-js)

    博主正在重构博客中,刚开始时静态资源都是上传到本地服务器的,但这个项目博主最后打算真正上线运营的.索性就改进了下,把静态资源尽量放到云存储中,方便后续开发.这里把方法和遇到坑给记录下. 1.使用前提注 ...

  3. 七牛上传图片初探 开始上传 暂停上传 继续上传

    效果 代码 public class MainActivity extends AppCompatActivity {ListView listview;AlbumList albumList;@Ov ...

  4. 简单使用七牛图床 API 上传与下载图片

    1. 注册一个七牛帐号,创建一个共有储存空间,傻瓜操作: 网址: [https://portal.qiniu.com/create] 2. 在七牛开发者个人中心的密钥管理中,把 ACCESSKEY 和 ...

  5. 七牛前端使用JS-SDK上传文件完成时返回code:400报错

    用file API获取到文件流 然后根据官方文档传入封装的upload函数,在传输完成后报错400 {code: 400, message: "xhr request failed, cod ...

  6. 调用七牛SDK,在上传之前限制图片尺寸大小

    七牛sdk地址:https://developer.qiniu.com/kodo/sdk/1283/javascript  点击打开链接 调用过Qiniu SDK的人应该都知道 Qiniu.uploa ...

  7. 七牛云存储之覆盖上传

    概述: 本地文件修改,然后需要覆盖在七牛存储空间原本已经存在的文件,那么这时需要使用七牛提供的覆盖上传: 问题: 如何实现,以及实现思路? 思路: 1.七牛提供上传策略,指定scope为< bu ...

  8. node.js实现formdata上传文件

    node.js实现formdata上传文件 1.关于formdata XMLHttpRequest Level 2 添加了一个新的接口--FormData.利用 FormData 对象,我们可以通过 ...

  9. 使用Node.js express 开发上传文件/图片api接口

    我是傲夫靠斯,欢迎关注我的公众号[前端工程师的自我修养],每天更新. 今天我们来搞一个Node.js Express的上传文件功能,我使用了busboy这个库. Busboy是一个基于事件的文件流解析 ...

最新文章

  1. python实现D‘Agostino‘s K-squared test正态分布检验
  2. Acwing第 24 场周赛【完结】
  3. caffe 提取特征并可视化(已测试可执行)及在线可视化
  4. 同一个工作组无法查看计算机,win7系统在同一个工作组看不到其他电脑的解决方法...
  5. 最全知识点总结!| 大数据学习路线指南
  6. 多表关联查询_【函数007】 EXCEL多表关联查询实战
  7. 设计模式的C语言应用-访问者模式-第九章
  8. linux删除几日的文件脚本,Windows Linux 删除N天之前文件脚本
  9. Eucalyptus EE的介绍及功能说明
  10. 大规模数据存储集群数据存放的设计,分布式shardid的生成 - 如何指定范围随机数, 分组随机数...
  11. 检查Mysql引擎的方法
  12. 控制变量!控制变量!
  13. 为什么感觉现在电脑病毒少了?
  14. Markdown目录生成
  15. 1741. Communication Fiend(dp)
  16. 5分钟学废携程出品配置中心阿波罗的原理与搭建
  17. 小程序 云开发 数据库操作
  18. Unix/C/C++--数据类型转换、格式化、cpy、精度
  19. 初识go-micro
  20. CF577B Modulo Sum(dp,抽屉原理 | bitset优化 | 二进制优化)

热门文章

  1. 迷你计算机主板,超级迷你,采用ARM处理器的电脑主板
  2. 有了这20个数据网站,再也不愁找不到各行业的分析研究报告了?
  3. 【AI实战】动手实现人脸识别程序
  4. 取名字的艺术(草稿)
  5. 燃!阿里11篇论文入选IJCAI2017 人工智能领域捷报频传
  6. 瑞芯微读取寄存器_经验-瑞芯微RK3399嵌入式开发板调试方法-电路城论坛 - 电子工程师学习交流园地...
  7. matlab 更改jdk版本,程序员怎么修改微信号
  8. Matlab实现美颜系统
  9. 我的世界服务器精灵模型文件在哪,[娱乐|机制]PokemonInfo — GUI界面查看精灵信息 , 精灵变照片[1.12.2] - 服务端插件 - Minecraft(我的世界)中文论坛 -...
  10. 三种开源库实现GIS坐标转换