最近在做网站,服务器端用django,前端用dojo。遇到文件上传的问题,记录一下。
当直接用form提交文件时,将form加上属性 enctype="multipart/form-data",即可上传文件。
但当用ajax上传时,就没那么简单了。
首先,不能用dojo.xhrPost,而要用dojo.io.iframe.send提交表单。
dojo.connect(uploadPortraitForm,'onsubmit',function(e){ dojo.io.iframe.send({ url: '/user/settings/portrait/', form: dojo.byId("uploadPortraitForm"), method: "post", handleAs: "json", load: function(response,ioargs){ dojo.byId('portraitError').innerHTML = response['error']; return response; }, error : function(response, ioArgs){ console.log(ioArgs.xhr.status); return response; } }); e.preventDefault(); });
一定要加e.preventDefault(),否则不能提交到指定的url,而是整个html的url。
另外,dojo.io.iframe对服务器端返回的数据格式有严格的要求,查文档可以看到,返回的数据必须是如下的html,数据必须包含在<textarea>标签下。
<html> <body> <textarea> payload </textarea> </body> </html>
源文档 <http://dojotoolkit.org/reference-guide/dojo/io/iframe.html#dojo-io-iframe>
在django中就写成:
res = '''<html><body><textarea>%s</textarea></body></html>''' % json.dumps(data) # data 为要返回的数据 return HttpResponse(res)
可这样写有一个不好,就是html与python未分离,所幸这段html不复杂,暂且就这样放着吧。