gpt4 book ai didi

java - Spring 托 : uploading large files (1GB) via rest controller

转载 作者:搜寻专家 更新时间:2023-11-01 03:33:03 26 4
gpt4 key购买 nike

[上下文:java 8,spring boot 1.5.1]

我们正在创建一个 RESTful 服务,我们需要能够上传大文件。我想要的是一个看起来像这样的 api

@RequestLine("POST /object")
@Headers("Content-Type: multipart/form-data")
void create(InputStreamResource resource, ...);

我不想使用 MultipartFile 因为整个文件都会被读取,也不想使用 HttpServletRequest 因为它似乎不属于这里而是乞求需要某种 HttpMessageConverter。话虽如此,使用 HttpServletRequest 我可以按如下方式解决问题

ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterator = upload.getItemIterator(request);
while (iterator.hasNext()) {
FileItemStream e = iterator.next();
if (!e.isFormField()) {
InputStream inputStream = item.openStream();
//...
}
}

理想情况下,我想要一个 InputStream 或包装一个的东西,例如InputStreamResource(如上所示)。

如有任何建议,我们将不胜感激。

最佳答案

我让它以这种方式工作,这似乎是处理没有临时文件的上传或使用@RequestBody 注释将文件读入字节数组的唯一方法,正如 stackoverflow.com 在一个线程中所建议的那样:

@RequestMapping("firmware/{firmwareId:\\d+}/logs/upload")
public
@ResponseBody
ResponseEntity handleUploadLogs(@PathVariable("firmwareId") final Long firmwareId, final HttpServletRequest request) {
try (final InputStream is = getInputStream(request)) {
if (is != null) {
firmwareContentService.uploadLogs(firmwareId, is);

return ok().build();
} else {
return badRequest().build();
}
} catch (IOException | FileUploadException e) {
return badRequest().build();
}
}

private InputStream getInputStream(final HttpServletRequest request) throws IOException, FileUploadException {
final ServletFileUpload upload = new ServletFileUpload();
final FileItemIterator iterator = upload.getItemIterator(request);

InputStream is = null;

while (iterator.hasNext()) {
final FileItemStream item = iterator.next();

if (!item.isFormField()) {
is = item.openStream();

break;
}
}

return is;
}

更新

这个简单的代码也适用于我。只需将 InputStream 放入方法参数中即可:

@PostMapping("firmware/{firmwareId:\\d+}/logs/upload")
public
@ResponseBody
ResponseEntity handleUploadLogs(@PathVariable("firmwareId") final Long firmwareId, final InputStream is) {
try {
firmwareContentService.uploadLogs(firmwareId, is);

return ok().build();
} catch (IOException e) {
return badRequest().build();
}
}

<罢工>

上面的“简单代码”实际上并没有起作用。方法参数中的 InputStream 包含整个 http 请求。

关于java - Spring 托 : uploading large files (1GB) via rest controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426473/

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