Spring MVC处理部分文件上传

时间:2015-05-20 17:21:16

标签: spring spring-mvc multipartform-data

我需要处理包含要上传到服务器的文件的multipart / form-data请求。如果客户端在完全上传文件之前断开连接,服务器应该保存部分上传的文件。

我正在使用Spring MVC Controller来处理这个问题:

public class FileUploadController {

       @RequestMapping("/upload")
       public String handleUploadRequest(MultipartHttpServletRequest request) {
         MultipartFile file = request.getFile("File");
         InputStream stream = file.getInputStream();
         // read data from stream
  }
}

已延长CommonsMultiPartResover以覆盖

public class FileUploadMultipartResolver extends CommonsMultipartResolver {

@Autowired
ServletContext servletContext;

@Override
public void cleanupMultipart(MultipartHttpServletRequest request) {
    File tempDir = (File) servletContext.getAttribute(ServletContext.TEMPDIR);
    File[] files = tempDir.listFiles();
    for(int i=0; i< files.length; i++) {
        LOGGER.debug("filename: " + files[i].getName() + ", size: " + files[i].length());
    }
}    }

多部分属性设置为懒惰解析,内存大小最大:

@Configuration
public class RcseFtcsConfiguration {

@Bean(name="multipartResolver")
public MultipartResolver getMultipartResolver() throws IOException {
    FileUploadMultipartResolver resolver = new FileUploadMultipartResolver();
    resolver.setResolveLazily(true);
    resolver.setMaxInMemorySize(1024);
    return resolver;
} }

但是,当客户端在完全上传之前终止时,我无法获得部分上传的文件。

我认为MultiPartResolver应该为每个MaxInMemorySize字节将字节写入servlet容器临时目录但是没有发生..只有当完整的请求数据到达服务器时,我才能在servlet容器临时目录中看到数据。

我想知道我是否遗漏了什么。

1 个答案:

答案 0 :(得分:1)

MultiPart上传和可恢复上传完全不同。 您希望如何使用此方法在客户端上恢复上传?

有几种方法可以解决这个问题,其中一种方法是使用HTML5 File API在客户端切片文件并逐片上传。上传完所有切片后,您可以在服务器上组装它们。

resumable.js这样的图书馆拥有自己的#34;自定义协议&#34;通过HTTP跟踪上传进度,而其他人选择使用Content-Range requests to do this

现在回答你的问题,AFAIK对Spring Framework中的内容范围上传不支持;但您可以使用其中一种解决方案在服务器端实现可恢复的上传。