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)且关闭了批量上传

  

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'))
avatar

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

  Subscribe  
最新 最旧 得票最多
提醒
王可欣
游客

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

雨花
游客

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

XT
游客
XT

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

Perchouli
游客

评论

Perchouli
游客

继续测试

Perchouli
游客

测试