Spring MVC文件上传控制器 - 我希望上传开始后立即调用控制器

Dan*_*Dan 4 spring-mvc apache-commons-fileupload

使用裸servlet的doPost,当文件上载开始时,立即调用doPost.然后,我可以使用commons FileItemIterator从请求对象中流式传输文件.

使用Spring MVC,我似乎无法得到控制的方法来触发,直到的文件(S)已全部由服务器,这是不理想的接收.

我希望我的servlet/controller方法尽可能多地处理文件,并在上传中断时执行一些回滚操作.我目前无法使用Spring MVC做到这一点.

public void doPost(HttpServletRequest request, HttpServletResponse res){
//I can immediately stream the response here 
}
Run Code Online (Sandbox Code Playgroud)

@RequestMapping(value="/uploadFiles", method= RequestMethod.POST)
public @ResponseBody String addFiles(ContentManagerTicket ticket, HttpServletRequest request){
//I can't do anything until the files are received - whether i use a HttpServletRequset or MultiPartFile
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢!

M. *_*num 6

您希望流式文件上传,但在使用Spring的多部分(文件上载)支持时,它使用经典方法.这基本上意味着在请求实际传递给控制器​​之前,会解析请求的所有多部分.这是必需的,因为a MultipartFile可以用作方法参数,并且为了使其工作,它需要可供控制器使用.

如果你想处理流文件上传,你必须禁用Spring的多部分支持,并在控制器中自己进行解析,就像在servlet中一样.

@Controller
public class FileUploadController {

    @RequestMapping("/upload")
    public void upload(HttpServletRequest request) {
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (!isMultipart) {
            // Inform user about invalid request
        }

        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload();

        // Parse the request
        FileItemIterator iter = upload.getItemIterator(request);
        while (iter.hasNext()) {
            FileItemStream item = iter.next();
            String name = item.getFieldName();
            InputStream stream = item.openStream();
            if (item.isFormField()) {
                System.out.println("Form field " + name + " with value "+ Streams.asString(stream) + " detected.");
            } else {
                System.out.println("File field " + name + " with file name " + item.getName() + " detected.");
            // Process the input stream
            ...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅如何使用commons文件上传流式apiApache commons fileupload"Streaming API" 上传文件

  • 对不起,没关系.我正在使用Spring启动并使用AutoConfiguration,因此解决方案是:@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class}).谢谢! (5认同)