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
我正在使用 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.