我在网站上使用ajax。我已成功使用jQuery.ajax()
异步上传文件到服务器。我正在使用Dajax
和Dajaxice
,因此我计划将这些应用程序用于文件上传。我试过this例子。它工作正常。但是如果我将文件字段添加到我的html表单中,它就不会将文件发送到服务器。我的html表单看起来像
<form id="myform" action="/file/" method="post" enctype="multipart/form-data">
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='AaSmyBEwQLSD3YghRAD9Cf2uxEjzESUe' /></div>
<p><label for="id_docfile">Select a file</label> max. 42 megabytes</p>
<p><input type="file" name="docfile" id="id_docfile" /></p>
<p><input type="submit" value="Upload" /></p>
</form>
这个问题已在很多地方被提出但从未得到过回答。
答案 0 :(得分:1)
Afaik目前dajax / dajaxice中没有提供上传文件的条款。
我在一些项目中使用了dajax,并使用blueimp/jquery-file-upload和一个django视图来接受上传文件的POST并将JSON
字符串返回给客户端。
这不是一个完美的解决方案,不仅仅是因为jquery-file-upload按钮的样式与普通的html表单元素不同,可以使用jQuery-ui来设置整个表单的样式,尽管这还有很多额外的工作
对于Java来说,dwr几乎是dajax,而django的tasty pie确实提供了文件上传,所以理论上应该可以实现它。
我很高兴发布我的ajax解决方案的样本,如果有人发现它们有用的话。
答案 1 :(得分:1)
我最近也遇到过这个问题。所以,我挖了一点,发现了一些答案。
工作正常。但是如果我将文件字段添加到我的html表单中,它就不会将文件发送到服务器。
doc示例中使用了serialize()
方法。但根据jQuery doc:
来自文件选择元素的数据未被序列化。
此外,没有明确的方法来获取ajax文件,因为JS无法访问客户端浏览器的外部。所以,我认为不可能使用dajaxice
。
最简单的黑客攻击,我发现使用target
选项将表单发布到隐形iframe:
<form method='POST' action='/upload' enctype='multipart/form-data' target='submit-iframe'>
所以,只会刷新iframe。使用js比从中获取数据可以捕获load()
事件。
更详细的流程here