Python Tech

Django+又拍云+file-uploader快速实现批量上传

最近做的工作都和Django没什么关系,或者都是比较底层的算法,不方便share,所以分享一些老东西。

之前写过Django用uploadify实现图片批量上传,从反馈来看,问题很多。现在uploadify更新到了3.2版,仍然是用swf来实现批量上传,代码还是老样子一团糟。作为替代换成了file-uploader,虽然是multipart/form-data来实现批量上传,不如swf的方式通用。但我不需要兼容老版本浏览器,做的都是富js应用,更看重代码的可扩展性,file-uploader更合适。

再说又拍云,最开始是在UEditor里做了一个图片上传到又拍云的功能,自动生成缩略图和水印的功能节省了不少开发时间。后来遇到一些不需要富文本编辑器的场合,就把这部分功能抽了出来,代码量非常小,是我至今用过的最快也是最通用的图片批量上传方案。

Javascript

首先在前台实现file-uploader。例子很简单,引入相关js/css文件,加载上传组件。其中params是要传递的参数,会以GET参数的形式传递到后台。options设置了图片选定自动上传(autoupload: true)且关闭了批量上传


  <div id="file-uploader"></div>
  <script>
  var options = {
    "element": document.getElementById('file-uploader'),
    "action": '/api/posts/upload.json',
    "autoUpload": true,
    "uploadButtonText": '选择图片上传',
    "sizeLimit": 5120000,
    "params": {
      "postId": 1
    },
    "onComplete": function(id, fileName, dataObject){
      console.log(dataObject);
    }
  };

  document.fineUploader = new qq.FileUploader(options);
  </script>

Django

点击上传按钮,选择图片,前端会请求api/posts/upload.json?postId=1&qqfile=上传文件名 ,之前关于uploadify最常见的问题就是取不到正确的request,因为uplodify是swf上传,对于file-uploader就不会有这个情况。用以下几行代码实现通过request.read的方式来读取上传的图片数据。


_request      = request
uploaded      = _request.read
file_size     = int(uploaded.im_self.META["CONTENT_LENGTH"])
file_name     = request.GET.get('qqfile')
image_content = _request.read(file_size)

如果不用又拍云,只保存上传的图片,就把image_content写入文件:


file = open(file_name, "wb+")
file.write(image_content)
file.close()

Upyun

下载又拍云提供的PythonSDK,把获得的图片文件传上去,返回图片地址,完整代码如下:


from upyun import UpYun
_request  = request
uploaded  = _request.read
file_size = int(uploaded.im_self.META["CONTENT_LENGTH"])
file_name = request.GET.get('qqfile')

_u = UpYun('空间名称','username','password')
_u.writeFile('/%d/%s' % (request.user.id, file_name),_request.read(file_size), True) 
#writeFile方法不会返回图片地址,所以得自己写
img_url = 'http://img.dmyz.org/%d/%s' % (request.user.id, fileName)
return img_url

根据又拍云的文档,可以用put方式来上传,所以不用sdk,简单把文件传到又拍云的代码是:


import request
upload_url = 'https://v0.api.upyun.com/空间名/%s' % file_name
requests.put(upload_url, data=open(f.name, 'rw'), auth=('username', 'password'))
0 0 投票数
文章评分
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

7 评论
最新
最旧 最多投票
内联反馈
查看所有评论
王可欣
10 年 前

请问,您这个能显示上传进度和上传速度吗,对于php实现相同功能不难吧?

雨花
10 年 前

可以给个完整的代码吗,非又拍云

XT
XT
10 年 前

对于django fineuploader,不知博主能否指教一二,这篇文章我都快背下来了都弄不出来,拜托了。

Perchouli
11 年 前

评论

Perchouli
11 年 前

继续测试

Perchouli
11 年 前

测试