gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:51:06 24 4
gpt4 key购买 nike

我正在使用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')));

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

我尝试创建一个自定义FileController,在其中手动添加标题:
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 仍然保留,因此这是一种可能的解决方法。它只是与某些Flutter插件配合使用而无法很好地工作,这些插件会查找Content-Length header ,并且没有方便的方法来检查其他 header 。

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

最佳答案

此解决方案有效,但可以解决原始问题。如此,它允许您提供标题中具有Content-Length的文件,但没有说明为什么在Aqueduct中将其剥离。欢迎其他答案。

不是让Aqueduct服务文件,而是让Nginx直接服务文件。

如果您无法更改API路由,则可以在Nginx配置位置块中为其指定别名。将此添加到/api位置块之前。

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

现在 app/文件夹中的文件将由Nginx提供,而不是由Aqueduct提供。 Nginx在返回的文件中包含Content-Length header 。

关于flutter - Aqueduct提供的文件没有Content-Length header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61318517/

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