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)
有任何想法吗?谢谢!
您希望流式文件上传,但在使用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文件上传流式api和Apache commons fileupload"Streaming API" 上传文件
| 归档时间: |
|
| 查看次数: |
3160 次 |
| 最近记录: |