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

2024-04-06

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

使用 Spring MVC,我似乎无法触发控制器方法,直到after文件已全部被服务器接收,这并不理想。

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

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

vs.

@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
}

有任何想法吗?谢谢!


你要流式文件上传 http://commons.apache.org/proper/commons-fileupload/streaming.html但是当使用时Spring 的多部分(文件上传)支持 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart-resolver-commons它用经典方法 http://commons.apache.org/proper/commons-fileupload/using.html。这基本上意味着请求的所有多部分都在请求实际传递给控制器​​之前被解析。这是需要的,因为MultipartFile http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/multipart/MultipartFile.html可以用作方法参数,并且要使其工作,它需要可供控制器使用。

如果你想处理流文件上传,你必须禁用 Spring 的多部分支持并执行解析 http://commons.apache.org/proper/commons-fileupload/streaming.html您自己在控制器中,就像在 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
            ...
            }
        }
    }
}

也可以看看如何使用 commons 文件上传流 api 上传文件 https://stackoverflow.com/questions/15432024/how-to-upload-a-file-using-commons-file-upload-streaming-api and Apache commons fileupload“流 API” https://stackoverflow.com/questions/11620432/apache-commons-fileupload-streaming-api

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐