我正在尝试使用Valum的Ajax Upload在我正在制作的基于Django的网站上进行文件上传.目前我正在避免表单只是因为AU在ajax请求中将上传作为整个POST数据发送.现在我有一个非常天真的方法来做到这一点:
upload = SimpleUploadedFile( filename, request.raw_post_data )
...then I loop through the chunks to write to disk...
Run Code Online (Sandbox Code Playgroud)
这适用于小文件.我已经测试了PDF,各种其他文件,以及大约20MB的Google Chrome deb软件包,它们都很棒.但是,如果我升级到类似CD或DVD的东西,它会发生可怕的轰炸.Django通常会发回Out of Memory响应.从表面上看,这是有道理的,因为SimpleUploadedFile是上传类的内存中版本.我看不到如何使用TemporaryUploadedFile,因为它没有在其构造函数中获取实际内容.作为旁注:我认为在耗尽可用的RAM后,它会转到虚拟内存,但无论如何.
所以,我的问题是,我如何让它工作?有更好的方法来读取文件吗?我尝试通过Python的IO直接读取raw_post_data(系统使用2.6.5),但是当使用二进制文件时,FileIO的ascii编码器/解码器显然会抱怨非ascii字符.我无法找到有关更改编码器/解码器的信息.
我不介意将数据传递到表单中并让Django完成选择正确的上传类的工作等等,但我无法弄清楚如何传递它,因为像
upload_form = UploadForm( request.POST, request.FILES )
Run Code Online (Sandbox Code Playgroud)
将无法工作,因为POST包含文件而不是正常的Django信息,并且FILES不存在.
正如我所说,我并不担心解决方案的方法,只是我得到了一些有用的东西!谢谢!
我有一个Django站点,其中一个页面正在进行基于AJAX的文件上传(使用Valum的文件上传器),它通过JSON返回一些信息.Django返回JSON的方式是......
return HttpResponse( json.dumps( info ), mimetype="application/json" )
Run Code Online (Sandbox Code Playgroud)
在Firefox,Chrome和Safari中尝试页面时,我会获得文件上传器的相应行为,标记上传完成并将数据插入页面上的表格中.
在IE8中进行测试后,我在Django发回JSON后得到了错误的行为:出现了一个下载对话框 - 如果保存它就是JSON文本 - 并且文件上传者继续认为文件正在上传,因为它没有收到任何响应从服务器.IE必须看到响应并将其解释为下载而不是将其传递给页面的javscript.请注意,我已经尝试将mime更改为application/javascript,这似乎没有任何区别.有人得到了修复?