启用HiddenHttpMethodFilter后使用Spring MVC 3.0.2上载多个文件

启用HiddenHttpMethodFilter后使用Spring MVC 3.0.2上载多个文件,spring,spring-mvc,file-upload,spring-3,Spring,Spring Mvc,File Upload,Spring 3,重要提示:对于任何高于3.0.4的Spring版本,此问题都是完全无用的,因为此线程中讨论的问题很久以前就存在于该版本中,并且在随后的Spring版本中不再重复 我使用的是Spring版本3.0.2。我需要使用文件浏览器的multiple=“multiple”属性上载多个文件,例如 <input type="file" id="myFile" name="myFile" multiple="multiple"/> 即使使用请求参数@RequestParam(“myFile”)也会

重要提示:对于任何高于3.0.4的Spring版本,此问题都是完全无用的,因为此线程中讨论的问题很久以前就存在于该版本中,并且在随后的Spring版本中不再重复


我使用的是Spring版本3.0.2。我需要使用文件浏览器的
multiple=“multiple”
属性上载多个文件,例如

<input type="file" id="myFile" name="myFile" multiple="multiple"/>
即使使用请求参数
@RequestParam(“myFile”)也会列出属于类型的文件
(每次只能有一个文件)


我可以找到一种可能处理多个文件的策略。我已经仔细看过了

解决方案下面的解决方案部分解决方案2–使用原始请求:

然而,如果客户端坚持使用相同的表单输入名称,例如 作为“文件[]”或“文件”,然后用多个 然后需要进行如下小规模的破解。如上所述,春天 2.5如果多次检测到类型文件的相同表单输入名称,则引发异常抛出的类 该异常不是最终异常,引发该异常的 使用继承和子类化的奇迹来保护它 您只需按如下方式稍微修改逻辑即可。变化 我用一个词来表示一个方法调用 这使我们能够在同一表单下接收多个文件 输入名称

它试图覆盖该方法

protected MultipartParsingResult parseFileItems(List fileItems, String encoding){}
通过扩展类,例如

导致编译时错误,因为第一个参数
multipartFiles
是由实现的一种类型,但实际上,它需要一个类型为
MultiValueMap

它是抽象类中静态类的构造函数

但是没有成功。我不知道如何替换,甚至这样做也可以。执行此操作后,浏览器将显示Http响应

HTTP状态400-

类型状态报告

消息

说明客户端发送的请求在语法上不正确 ().

ApacheTomcat/6.0.26


我已经尽可能地缩短了问题,并且没有包含不必要的代码

在Spring配置了多个文件后,如何才能上传多个文件

该博客表明它是一个长期存在的高优先级bug

如果没有关于3.0.2(3或更高版本)的解决方案,那么我必须永远禁用Spring支持,并按照博客上第三个解决方案的建议继续使用,永远忽略PUT、DELETE和其他请求方法



对类中的
parseFileItems()
方法中的代码进行很小的更改可能会使它上载多个文件,但我的尝试无法成功(同样是Spring版本3.0.2(3或更高版本))。

对于在一个请求中上载多个文件,我使用了以下代码:

我有这样的jsp:

<p>Select files to upload. Press Add button to add more file inputs.</p>
<table>
    <tr>
        <td><input name="files" type="file" multiple="true"/></td>
    </tr>
    <tr>
        <td><input name="files" type="file" multiple="true"/></td>
    </tr>
</table>
<br/><input type="submit" value="Upload" />
import org.springframework.web.multipart.commons.CommonsMultipartFile;

public class FileUploadForm {

    private CommonsMultipartFile [] files;

    public CommonsMultipartFile[] getFiles() {
        return files;
    }

    public void setFiles( CommonsMultipartFile[] files ) {
        this.files = files;
    }
}
@Controller
@RequestMapping("/upload")
public class FileUploadController {

    @RequestMapping(method = RequestMethod.GET)
    public String displayForm(ModelMap modelMap) {
        modelMap.addAttribute( new FileUploadForm() );
        return "uploadForm.jsp";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String save(FileUploadForm uploadForm) {
        CommonsMultipartFile[] files = uploadForm.getFiles();
        if(files != null && files.length != 0) {
            for(MultipartFile file : files) {
                System.out.println( file.getOriginalFilename() );
            }
        }
        return "success.jsp";
    }
}

控制器:

<p>Select files to upload. Press Add button to add more file inputs.</p>
<table>
    <tr>
        <td><input name="files" type="file" multiple="true"/></td>
    </tr>
    <tr>
        <td><input name="files" type="file" multiple="true"/></td>
    </tr>
</table>
<br/><input type="submit" value="Upload" />
import org.springframework.web.multipart.commons.CommonsMultipartFile;

public class FileUploadForm {

    private CommonsMultipartFile [] files;

    public CommonsMultipartFile[] getFiles() {
        return files;
    }

    public void setFiles( CommonsMultipartFile[] files ) {
        this.files = files;
    }
}
@Controller
@RequestMapping("/upload")
public class FileUploadController {

    @RequestMapping(method = RequestMethod.GET)
    public String displayForm(ModelMap modelMap) {
        modelMap.addAttribute( new FileUploadForm() );
        return "uploadForm.jsp";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String save(FileUploadForm uploadForm) {
        CommonsMultipartFile[] files = uploadForm.getFiles();
        if(files != null && files.length != 0) {
            for(MultipartFile file : files) {
                System.out.println( file.getOriginalFilename() );
            }
        }
        return "success.jsp";
    }
}
此代码允许在一个请求中上载多个文件,
并且可以为每个文件获取
commonmultipartfile
的实例。

问题中提到的问题是从Spring 3.0.4开始的。因此,如果您碰巧使用了该版本或更高版本(是的,现在是4.x.x),您将不再需要阅读此问题/答案。

博客文章中提到的问题自3.0.4版起已修复,您可以尝试升级吗?@RC-感谢您的链接。我有一个大的应用程序,已经完成了一半以上。更改框架可能需要在许多地方更改代码,因此,我只能为未来的项目考虑更高版本(我应该在开始之前就知道)。谢谢。3.0.2到3.0.4只是一个小升级(如果我看版本号的话,主要是错误修复),所以应该不会有什么痛苦。如果可以的话,你应该试试看。我现在已经将Spring版本从3.0.2升级到了3.0.2,在这个版本中,问题可以正确地解决。但是如果有人能够解决这个问题,我会非常感激。也许我不清楚。我请求该文件的原因是查看信息如何到达多部分数据。这样,您就可以排除简单的regexp解析的问题,并且可以在不使用公共文件上载的情况下获取所有文件和变量。是的,这是一种上传多个文件的方式,我用来上传多个文件的技术与您展示的技术没有什么不同,但我之前使用的Spring framework 3.0.2(或更低版本)无法使用。其中,上载了一个文件(通常是从文件浏览中选择的文件列表中的第一个文件)。你是说这个版本吗?这个版本对你有用吗?我敢肯定,这不应该发生在这个版本的Spring上,对吗?这个答复非常受欢迎。非常感谢。
import org.springframework.web.multipart.commons.CommonsMultipartFile;

public class FileUploadForm {

    private CommonsMultipartFile [] files;

    public CommonsMultipartFile[] getFiles() {
        return files;
    }

    public void setFiles( CommonsMultipartFile[] files ) {
        this.files = files;
    }
}
@Controller
@RequestMapping("/upload")
public class FileUploadController {

    @RequestMapping(method = RequestMethod.GET)
    public String displayForm(ModelMap modelMap) {
        modelMap.addAttribute( new FileUploadForm() );
        return "uploadForm.jsp";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String save(FileUploadForm uploadForm) {
        CommonsMultipartFile[] files = uploadForm.getFiles();
        if(files != null && files.length != 0) {
            for(MultipartFile file : files) {
                System.out.println( file.getOriginalFilename() );
            }
        }
        return "success.jsp";
    }
}