在http请求之间保留文件

时间:2010-07-01 16:41:48

标签: java ajax file-upload spring-mvc

想象一下上传文件的简单形式:

<form action="upload" enctype="multipart/form-data">
    <input type="text" name="name"/>
    <input type="file" name="file"/>
    <input type="submit"/>
</form>

如果有错误(无法复制文件,名称不正确......)提交表单,则必须返回同一页面,但我选择的文件将丢失。如果用户每次都必须选择文件,那么必须验证服务器端的多个字段的大型表单会非常烦人。

考虑到这一点,我找到了几种可能的解决方案:

  • 提交表单作为ajax请求,只有在验证正确时才转到下一页。问题是我必须实现一些东西来将每个验证错误放在其位置而不是使用MVC的功能(在我的例子中是Spring MVC表单标签)。

  • 提交表格。如果有错误,请在javascript中发送带有“history.back()”的页面。我的文件将再次存在,但我没有简单的方法来显示验证消息。

我认为这两种解决方案都非常笨拙。但是,每次出现验证错误时选择文件也不是一个好的解决方案。

你怎么看?哪种解决方案更好?有没有好的(最好没有javascript)?

感谢。

注意:我正在使用Spring MVC 3

3 个答案:

答案 0 :(得分:4)

由于无法预填充 HTML中的input type="file"字段,因此文件字段将丢失。这是一个安全限制,以避免像这样的形式的笑话:

<form name="upload" action="upload" method="post" enctype="multipart/form-data">
    <input type="file" value="c:/passwords.txt"><input type="submit">
</form>
<script>document.upload.submit()</script>

您唯一的选择是在背景中提交表单,以便原始表单的页面保持打开状态。换句话说:Ajax。有几个JavaScript库可用于此任务,例如jQuery Form plugin。这基本上和

一样简单
$('#formId').ajaxForm();

(是的,它也适用于文件上传,此插件透明地转到“iframe模式”然后)

但是由于你使用的是不支持开箱即用的ajaxical请求的Spring MVC,你必须在服务器端创建一个自定义ViewResolver,让它可以无缝地处理ajaxical的东西。你可以找到一个很好的博客here,详细描述了这一点。

答案 1 :(得分:2)

使用AJAX不起作用,因为它无法处理文件上传。

另一种选择:将form提交到(隐形?)IFRAME:

<form target="iframe_name_here" ........

<iframe id="iframe_name_here"></iframe>
然后,您可以使用JavaScript从iframe中的页面内发送“成功”事件。

如果上传出错,我认为甚至应该保留所选文件。

答案 2 :(得分:0)

我不确定你打算做什么类型的验证,但是会把它分解成单独的页面,比如向导,文件上传是最后一步,有效吗?

使用Javascript,您可以使用Pekka建议的iframe方法。我见过的大多数Ajax文件上传器都是这样工作的。