【发布时间】:2014-01-07 16:49:19
【问题描述】:
我使用 Spring 3.2.5 通过控制器处理文件上传。
多部分处理配置在web.xml
<servlet>
<description></description>
<display-name>rest</display-name>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<multipart-config />
</servlet>
这是代码
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
ResponseEntity<Content> uploadFile(final HttpServletRequest request, @PathVariable final String id)
throws IOException, ServletException {
for (final Part part : request.getParts()) {
log.debug("Content-Type: {}", part.getContentType());
for (final String key : part.getHeaderNames()) {
log.debug("Header {}: {}", key, part.getHeader(key));
}
log.debug("Name: {}", part.getName());
log.debug("Size: {}", part.getSize());
final String fileName = getPartName(part);
log.debug("File name: {}", fileName);
final DataSource ds = new DataSource() {
@Override
public String getContentType() {
String ct = ContentController.this.getContentType(part.getContentType(), null);
if (ct == null) {
final Pattern p = Pattern.compile("^.+\\.(.+?)$");
final Matcher m = p.matcher(fileName);
if (m.matches()) {
ct = ContentController.this.getContentType(m.group(1), m.group(1));
}
}
return ct;
}
@Override
public InputStream getInputStream() throws IOException {
return part.getInputStream();
}
@Override
public String getName() {
return fileName;
}
@Override
public OutputStream getOutputStream() throws IOException {
return null;
}
};
final Content content = service.storeFile(ds, id, part.getSize());
if (content != null) {
return new ResponseEntity<>(content, IE89PostWorkaround(request), HttpStatus.CREATED);
}
}
return new ResponseEntity<>(new Content(), IE89PostWorkaround(request), HttpStatus.BAD_REQUEST);
}
我想知道为什么在整个文件上传之前没有达到第一个日志语句的断点? 看起来请求在您开始处理之前首先被完全读取。
有没有办法实现以下行为:
- 在上传开始后立即从上传中获取文件信息
- 获取
InputStream并通过系统将其路由到它的目标,在那里进行处理(之前没有读入 RAM 或文件)
【问题讨论】:
标签: java jakarta-ee file-upload servlet-3.0