因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新。请访问我的个人网站获取这篇文章的最新内容,七牛云存储的 Web 前端文件上传

七牛是不错的云存储产品,特别是有免费的配额可供使用,存点小文件或者博客的插图什么的还是不错的。以下介绍在自己的Web应用中上传文件到七牛的方法。

基本思想

当我们想把本地的文件通过浏览器上传到自己的七牛云存储空间上时,就有两种思路

  1. 将文件直接上传到服务端,再由服务端将文件传输至七牛
  2. 向服务端请求七牛的文件上传token,然后将文件上传至七牛(授权式上传)

第1种方法较好解决,参考七牛的文档即可,第2种方法效率较高,这里介绍第2种。

使用Javascript在Web前端上传文件的方法,七牛官方给出了文档例子。核心内容在于这几点:

  1. 指定上传按钮的ID
  2. 创建一个uploader

    2.1 绑定上传按钮的ID

    2.2 设置获取上传token的服务端url
<div id="btn-uploader">
<a id="pickfiles" href="javascript:void 0;">Upload File</a>
</div>

这里上传按钮的ID是pickfiles

uploader = Qiniu.uploader({
//...
});

设置uploader的参数

七牛的Javascript SDK使用到了Plupload,在初始化uploader时,可以为其传递Plupload中给定的Option,而不仅局限于七牛例子中给出的。例如可以添加multi_selectionfilters来限制上传时,文件的选择。

文件命名

当文件上传至七牛云存储时,文件的命名显得尤为重要,缺省情况下,七牛会使用上传文件的名字命名,然而文件重名将难以避免,并且重名将导致无法上传或覆盖旧文件。为了解决这一问题,有三种方法

  1. 由qiniu自动生成唯一的文件名,在uploader中设置unique_names=true
  2. 由服务端生成文件名,在uploader中设置save_key=true,并且在服务端返回token时,设置policy.saveKey的值为所要保存的文件名。
  3. Web 前端自定义文件名,key函数中设置文件名,缺点是文件名无法有效管理。

以下使用Python和Flask框架为例,介绍服务端生成文件名的方法。

import json
import qiniu.rs @app.route("/qiniu-token/")
def qiniu_token():
policy = qiniu.rs.PutPolicy('your-bucket-name')
policy.saveKey = 'save_key'#设置上传文件的文件名
uptoken = policy.token()
return json.dumps({'uptoken': uptoken})

服务端会返回如下格式的JSON,里面已包含了文件名

{
"uptoken": "0MLvWPnyya1WtPnXFy9KLyGHyFPNdZceomL..."
}

但是服务端仍无法获悉本地文件的文件类型,因此无法给出恰当的文件名,虽然设置文件名时缺失扩展名,不影响文件的下载,但明显不漂亮。

这时就需要先在本地先获取文件扩展名后,再向服务端请求,由服务端安排一个文件名(服务端掌握所有文件的信息,可以方便文件的命名和管理)。

uploaderinit参数中,有一个key参数,可以为其绑定函数来设置文件名。该函数启用的前提是save_keyunique_names设为false

key对应的函数中使用ajax向服务端请求文件名,然后与文件的扩展名组合后就得到了恰当的文件名了。特别注意的是,这里的ajax调用用使用同步的方式,因为需要在该函数返回前就得到服务端回应的信息,如果使用异步的方式,函数都返回了,服务端还没响应呢。

uploader = Qiniu.uploader({
//...
init: {
'Key': function(up, file) {
//当save_key和unique_names设为false时,该方法将被调用
var key = "";
$.ajax({
url: '/qiniu-token/get-key/',
type: 'GET',
async: false,//这里应设置为同步的方式
success: function(data) {
var ext = Qiniu.getFileExtension(file.name);
key = data + '.' + ext;
},
cache: false
});
return key;
}
//...
}
});

以下是uploader的详细设置,其他完整的信息请参考七牛的例子,并加以改造。

uploader = Qiniu.uploader({
runtimes: 'html5,flash,html4',
browse_button: 'pickfiles',//上传按钮的ID
container: 'btn-uploader',//上传按钮的上级元素ID
drop_element: 'btn-uploader',
max_file_size: '100mb',//最大文件限制
flash_swf_url: '/static/js/plupload/Moxie.swf',
dragdrop: false,
chunk_size: '4mb',//分块大小
uptoken_url: '/qiniu-token/',//设置请求qiniu-token的url
//Ajax请求upToken的Url,**强烈建议设置**(服务端提供)
// uptoken : '<Your upload token>',
//若未指定uptoken_url,则必须指定 uptoken ,uptoken由其他程序生成
// unique_names: true,
// 默认 false,key为文件名。若开启该选项,SDK会为每个文件自动生成key(文件名)
// save_key: true,
// 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK在前端将不对key进行任何处理
domain: 'http://your-bucket-name.qiniudn.com/',//自己的七牛云存储空间域名
multi_selection: false,//是否允许同时选择多文件
//文件类型过滤,这里限制为图片类型
filters: {
mime_types : [
{title : "Image files", extensions: "jpg,jpeg,gif,png"}
]
},
auto_start: true,
init: {
'FilesAdded': function(up, files) {
//do something
},
'BeforeUpload': function(up, file) {
//do something
},
'UploadProgress': function(up, file) {
//可以在这里控制上传进度的显示
//可参考七牛的例子
},
'UploadComplete': function() {
//do something
},
'FileUploaded': function(up, file, info) {
//每个文件上传成功后,处理相关的事情
//其中 info 是文件上传成功后,服务端返回的json,形式如
//{
// "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
// "key": "gogopher.jpg"
//}
var domain = up.getOption('domain');
var res = eval('(' + info + ')');
var sourceLink = domain + res.key;//获取上传文件的链接地址
//do something
},
'Error': function(up, err, errTip) {
alert(errTip);
},
'Key': function(up, file) {
//当save_key和unique_names设为false时,该方法将被调用
var key = "";
$.ajax({
url: '/qiniu-token/get-key/',
type: 'GET',
async: false,//这里应设置为同步的方式
success: function(data) {
var ext = Qiniu.getFileExtension(file.name);
key = data + '.' + ext;
},
cache: false
});
return key;
}
}
});

七牛云存储的 Javascript Web 前端文件上传的更多相关文章

  1. Web前端文件上传进度的显示

    跟后台关系不大,主要是前端js实现,具体使用了XMLHttpRequest的ProgressEvent事件,可以参考MDN中的Using XMLHttpRequest https://develope ...

  2. Web Uploader文件上传插件

    http://www.jq22.com/jquery-info2665   插件描述:WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现 ...

  3. web前端图片上传(3)--filereader

    这篇文章主要是为了介绍一种文件上传的方式.当然文件中是包含图片的.如果大家仔细看我的第一篇web前端图片上传(1)就会知道,其实也是按照这种方式上传你的,但是由于上次时间比较紧张,没有详细的介绍今天的 ...

  4. Web Uploader文件上传&&使用webupload有感(黄色部分)

    引入资源 使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF. <!--引入CSS--> <link rel="stylesheet" ...

  5. Web大文件上传断点续传解决方案

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  6. JavaScript,php文件上传简单实现

    非ajax,非iframe,最原始使用file控件的文件上传,记录过程备忘.(同步,页面刷新) 实现目标,能够将文件上传到指定位置. 客户端用input的file控件: <form action ...

  7. jq实现前端文件上传

    FormData FormData是XMLHttpRequest Level 2 新增的一个接口. 使用FormData可以实现各种文件上传. 使用 // 创建FormData的实例 var form ...

  8. 【Web】前端文件上传,带进度条

    最近做项目发现,在文件上传的过程中,增加进度条,能大大改善用户体验.本例介绍带进度条的文件上传 环境搭建 参考:[Java]JavaWeb文件上传和下载. 原生ajax上传带进度条 <%@ pa ...

  9. Baidu WebUploader 前端文件上传组件的使用

    简介 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流I ...

随机推荐

  1. Qt QScrollArea and layout in code

    Qt QScrollArea and layout in code 一.参考文档: . Qt 第六章 QScrollArea类给QWidget添加滚动条 http://blog.csdn.net/co ...

  2. 在CentOS 7上安装GitLab

    网上安装gitlab的方法有一堆,由于墙的原因,没有一个能安装成功,最后终于在中文版官网上面找到了RPM包可以下载,进行一键安装: 中文官网地址:http://www.gitlab.cc/ 下载地址为 ...

  3. Jmeter-ForEach控制器

    ForEach Controller需要配合‘用户定义的变量’来使用,作用是参数化 名称:字面意思,ForEach Controller的名称 注释:字面意思 输入变量前缀:变量的前缀:如要使用的变量 ...

  4. Jmeter简单的操作数据库

    mysql驱动包下载地址: https://dev.mysql.com/downloads/connector/j/ 1.添加驱动配置,把下载下来的驱动配置上去 2.添加‘配置元件-用户定义的变量’, ...

  5. BZOJ4837:[Lydsy1704月赛]LRU算法(双指针&模拟)

    Description 小Q同学在学习操作系统中内存管理的一种页面置换算法,LRU(LeastRecentlyUsed)算法. 为了帮助小Q同学理解这种算法,你需要在这道题中实现这种算法,接下来简要地 ...

  6. LOJ2421 NOIP2015 信息传递 【tarjan求最小环】

    LOJ2421 NOIP2015 信息传递 LINK 题目大意就是给你一个有向图,求最小环 有一个很奇妙的性质叫做每个点只有一条出边 然后我们考虑对每个强联通分量进行考虑 发现每个强联通分量内的边数一 ...

  7. 在liunx系统安装负载生成器(Load Generator)

    #初始化系统 yum -y update yum -y install ntpdate ntpdate asia.pool.ntp.org yum -y install wget make cmake ...

  8. flask第十三篇——url注意事项

    先和大家说一下常用的请求方法 get:只是从服务器获取数据,不会对服务器的状态或数据产生任何影响: get方法的参数是放在URL中传递的. post:会对服务器的状态或数据产生影响:通过body形式进 ...

  9. bat总结1

    获取当前目录 @echo offecho 当前盘符:%~d0echo 当前盘符和路径:%~dp0echo 当前盘符和路径的短文件名格式:%~sdp0echo 当前批处理全路径:%~f0echo 当前C ...

  10. css 常用类名

    1.页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sidebar 栏目:column  ...