如何在 Quarkus 中处理大文件上传
How to handle large file uploads in Quarkus
我的问题有两个:
我正在寻找一种在 quarkus 应用程序服务器上实现多部分文件上传的方法,允许程序员访问上传的文件。
浏览文档似乎有 https://quarkus.io/guides/rest-client-multipart,但这并没有告诉我文件存储在服务器上的什么位置(如果有的话)。
我还想知道幕后发生了什么。对于大文件(>100MB),内存占用情况如何?
Quarkus 使用 JBoss 中的 RESTEasy 实现。所以,如果您查看 their documentation,就会找到您需要的内容。
Quarkus 使用以下属性的组合来管理多部分有效载荷:
quarkus.http.body.handle-file-uploads=true
判断是否接受multipart请求。不过根据文档,您的应用程序仍将接受多部分请求,无论其设置为何。
quarkus.http.body.uploads-directory
上传文件的相对或绝对路径
quarkus.http.body.delete-uploaded-files-on-end
控制请求结束时是否清除上传的文件。
quarkus.http.body.preallocate-body-buffer =true
根据 Content-Length
HTTP header.[=16 中的数字设置缓冲区大小来保存请求 body =]
I'd also like to know what's going on under the hood. For large files (>100MB) what would the memory footprint look like?
这是一个 open-ended 没有人可以安全预测的问题。你不会知道,直到你尝试。您的部署模式(本机或 JVM)也很重要 - 本机模式会产生串行垃圾 collection,并且可能会在 GC 发生时导致更长的等待时间。
正如@kolossus 所指出的,您可以通过内置的 quarkus 选项配置文件处理。然而,无论是否设置这些选项,quarkus 似乎都会以几乎完全相同的方式处理文件上传。
例如,使用 RESTEasy 的 @MultipartForm
public class Resource {
@FormParam("file")
public File file;
}
然后在一些控制器方法中:
@POST
@Path("/file")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response fileUpload(@MultipartForm Resource upload) {
log.info("File path: {}", upload.file.getAbsolutePath());
}
然后使用请求正文中的文件调用此方法,您应该会看到包含上传文件路径的日志输出(有点像 /var/folders/y_/_3mfhd2s5ks08fsmhnn80q440000gn/T/5e84410f27304d289f168a76d51b240a)。
但是,当您查看该路径时,您不会在任何地方看到该文件。
看来 quarkus 的选项默认设置为相应的值:
quarkus.http.body.handle-file-uploads=true
quarkus.http.body.uploads-directory=<some random directory in /var>
quarkus.http.body.delete-uploaded-files-on-end=true
注意:在 v1.4 上测试。1.Final
你应该用quarkus.http.limits.max-body-size,我用200M试过成功
我的问题有两个:
我正在寻找一种在 quarkus 应用程序服务器上实现多部分文件上传的方法,允许程序员访问上传的文件。 浏览文档似乎有 https://quarkus.io/guides/rest-client-multipart,但这并没有告诉我文件存储在服务器上的什么位置(如果有的话)。
我还想知道幕后发生了什么。对于大文件(>100MB),内存占用情况如何?
Quarkus 使用 JBoss 中的 RESTEasy 实现。所以,如果您查看 their documentation,就会找到您需要的内容。
Quarkus 使用以下属性的组合来管理多部分有效载荷:
quarkus.http.body.handle-file-uploads=true
判断是否接受multipart请求。不过根据文档,您的应用程序仍将接受多部分请求,无论其设置为何。quarkus.http.body.uploads-directory
上传文件的相对或绝对路径quarkus.http.body.delete-uploaded-files-on-end
控制请求结束时是否清除上传的文件。quarkus.http.body.preallocate-body-buffer =true
根据Content-Length
HTTP header.[=16 中的数字设置缓冲区大小来保存请求 body =]
I'd also like to know what's going on under the hood. For large files (>100MB) what would the memory footprint look like?
这是一个 open-ended 没有人可以安全预测的问题。你不会知道,直到你尝试。您的部署模式(本机或 JVM)也很重要 - 本机模式会产生串行垃圾 collection,并且可能会在 GC 发生时导致更长的等待时间。
正如@kolossus 所指出的,您可以通过内置的 quarkus 选项配置文件处理。然而,无论是否设置这些选项,quarkus 似乎都会以几乎完全相同的方式处理文件上传。
例如,使用 RESTEasy 的 @MultipartForm
public class Resource {
@FormParam("file")
public File file;
}
然后在一些控制器方法中:
@POST
@Path("/file")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response fileUpload(@MultipartForm Resource upload) {
log.info("File path: {}", upload.file.getAbsolutePath());
}
然后使用请求正文中的文件调用此方法,您应该会看到包含上传文件路径的日志输出(有点像 /var/folders/y_/_3mfhd2s5ks08fsmhnn80q440000gn/T/5e84410f27304d289f168a76d51b240a)。
但是,当您查看该路径时,您不会在任何地方看到该文件。
看来 quarkus 的选项默认设置为相应的值:
quarkus.http.body.handle-file-uploads=true
quarkus.http.body.uploads-directory=<some random directory in /var>
quarkus.http.body.delete-uploaded-files-on-end=true
注意:在 v1.4 上测试。1.Final
你应该用quarkus.http.limits.max-body-size,我用200M试过成功