gpt4 book ai didi

java - 如何直接处理来自fileupload的Inputstream

转载 作者:太空宇宙 更新时间:2023-11-04 15:18:18 24 4
gpt4 key购买 nike

我使用 Spring 3.2.5 通过 Controller 处理文件上传。多部分处理在 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或文件中)

最佳答案

您的循环调用 request.getParts() ,它返回 Collection<Part>因此,在进入循环的第一次迭代之前,需要完全解析浏览器输入。您所谓的文件上传实际上是一个 HTTP 请求,如下所示:

GET /fileUpload.do
Content-Type: multipart/form-data; boundary=--limit

--limit
content-disposition: form-data; name="description"
content-type: text/plain

This is the description of the file

--limit
content-disposition: form-data; name="image"
content-type: image/png

lksdf82203j1897239481231kadlqcdladaod82y3o98dqjdhdqkdh
q9wrcfdhlqhfoqwfn92q38uycrnwehrnqolwhfrnoq83y018yn8cy2
oqwdfopiqweuroq338rquncqwurqwercqfjqwcngreydisajf238jd
...

要获取构成请求的各个部分的列表,框架必须首先解析整个请求,这可能需要一段时间,具体取决于文件大小和网络速度。

您可以通过解析原始 InputStream 来加快速度返回者 request.getInputStream()自己动手,但目前我不知道有任何库可以让您以流方式处理多部分信封(例如,用于 XML 文档的 SAX API)。另外,我并不完全确定这将如何影响应用程序的可见性能。

关于java - 如何直接处理来自fileupload的Inputstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com