我试图实现一个REST服务(甚至是一个Servlet),这将使我能够快速预览"传入文件(包含单个文件的多部分请求)。
我们的想法是在数据库中解析和存储很少的第一行潜在巨大文件。
我面临的问题是Spring @RestController(在Tomcat上)在服务器收到整个请求并且MultipartFile已经存储在文件系统上之后运行。
我设法实现了一些与纯Servlet实现一起工作的东西(直接从HttpServletRequest读取多部分请求)但是......然后我需要手动完成所有的多部分解析。我尝试使用commons fileupload(http://commons.apache.org/proper/commons-fileupload/),但它也在文件系统上缓存文件,所以当我打电话时:
List<FileItem> uploads = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
所有freezes util整个文件都上传到服务器上。
如何处理这个问题的任何建议 - 最好是在Tomcat和@RestController上,如果可能的话。
答案 0 :(得分:1)
我相信你在commons-fileupload的正确轨道上。您只需使用"streaming" API即可。类似的东西应该有效:
@RestController
public class ARestController {
@RequestMapping(value = Routes.A_ROUTE, method = RequestMethod.POST)
public ResponseEntity<?> processMultiPart(HttpServletRequest request) {
try {
ServletFileUpload upload = new ServletFileUpload();
final FileItemIterator itemIterator = upload.getItemIterator(request);
while (itemIterator.hasNext()) {
final FileItemStream fileItemStream = itemIterator.next();
if (!fileItemStream.isFormField()) {
try (InputStream inputStream = fileItemStream.openStream()) {
// process the stream the way you want
}
}
}
} catch (Exception e) {
// ...
}
}
}
通过这种方式,您可以将这些部分作为流读取,使用您需要的任何内容,并丢弃其余部分。 FS上不会存储任何内容。