Aqueduct 提供的文件没有 Content-Length header

Files served with Aqueduct don't have a Content-Length header

我正在使用 Aqueduct 为我的 Flutter 应用编写后端。我设置了 Aqueduct,以便 Nginx 代理这样请求它:

server {

    root /home/web/my_server/web;
    index index.html index.htm;

    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ =404;
    }

    location /api {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://127.0.0.1:8888;
        proxy_http_version 1.1;
    }

    ...
}

在 Aqueduct 中,我使用 FileController:

提供文件
router.route("/api/v1/app/*")
    .link(() => LogController(context))
    .link(() => FileController("public/app/")
  ..setContentTypeForExtension('apk', ContentType('application', 'vnd.android.package-archive')));

但是,returns 不包含 Content-Length header 的任何文件。这意味着我无法显示下载进度。

我尝试创建一个自定义 FileController,我在其中手动添加了 headers:

final contentLengthValue = file.lengthSync();

return Response.ok(byteStream,
    headers: {HttpHeaders.lastModifiedHeader: lastModifiedDateStringValue,
      HttpHeaders.contentLengthHeader: contentLengthValue,
      'x-decompressed-content-length': contentLengthValue,
      HttpHeaders.cacheControlHeader: 'no-transform',
      HttpHeaders.acceptRangesHeader: 'bytes'})
  ..cachePolicy = _policyForFile(file)
  ..encodeBody = false
  ..contentType = contentType;

Content-Length header 仍被删除,但 x-decompressed-content-length header 仍然存在,因此这是一个可能的解决方法。它只是不能很好地与一些寻找 Content-Length header 的 Flutter 插件一起使用,并且没有方便的方法来检查其他 headers.

这是 Aqueduct 问题还是 Nginx 问题?我该如何解决?

这个解决方案有效,但绕过了原来的问题。也就是说,它允许您提供 header 中具有 Content-Length 的文件,但它没有解释为什么它在 Aqueduct 中被剥离。欢迎其他答案。

不是让 Aqueduct 提供文件,而是直接让 Nginx 提供文件。

如果你不能改变你的 API 路由,你可以在 Nginx 配置位置块中给它一个别名。在 /api 位置块之前添加它。

location /api/v1/app/ {
    alias /home/web/my_server/public/app/;
}

现在 app/ 文件夹中的文件将由 Nginx 而不是 Aqueduct 提供服务。 Nginx 在 returns.

文件中包含 Content-Length header