如何在 Quarkus 中处理大文件上传

How to handle large file uploads in Quarkus

我的问题有两个:

  1. 我正在寻找一种在 quarkus 应用程序服务器上实现多部分文件上传的方法,允许程序员访问上传的文件。 浏览文档似乎有 https://quarkus.io/guides/rest-client-multipart,但这并没有告诉我文件存储在服务器上的什么位置(如果有的话)。

  2. 我还想知道幕后发生了什么。对于大文件(>100MB),内存占用情况如何?

Quarkus 使用 JBoss 中的 RESTEasy 实现。所以,如果您查看 their documentation,就会找到您需要的内容。

Quarkus 使用以下属性的组合来管理多部分有效载荷:

  1. quarkus.http.body.handle-file-uploads=true判断是否接受multipart请求。不过根据文档,您的应用程序仍将接受多部分请求,无论其设置为何。

  2. quarkus.http.body.uploads-directory 上传文件的相对或绝对路径

  3. quarkus.http.body.delete-uploaded-files-on-end控制请求结束时是否清除上传的文件。

  4. 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试过成功