最近做的工作都和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'))
请问,您这个能显示上传进度和上传速度吗,对于php实现相同功能不难吧?
可以给个完整的代码吗,非又拍云
对于django fineuploader,不知博主能否指教一二,这篇文章我都快背下来了都弄不出来,拜托了。
可以加我的gtalk, jp.chenyang@gmail.com
评论
继续测试
测试