Joe*_*l B 6 google-chrome http-headers
我遇到了一个相当奇怪的情况,我很难在现有的 Django 应用程序中进行跟踪。其中一个从 APIView 继承的视图在用户进行 POST 调用时返回一个文件。端点工作正常,但是当下载的文件到达客户端机器时会发生一些奇怪的事情。当浏览器接收到文件时,文件扩展名已被重命名为尾随下划线。(因此假设文件最初是“test.txt”,客户端收到的版本将是“test.txt_”)。
据我所知,就在 APIView 中返回响应对象之前,content-type 和 content-disposition 标头看起来是正确的。例如:
Content-Type: application/octet-stream
Content-Disposition: attachment;filename="test.txt"
Run Code Online (Sandbox Code Playgroud)
同一个文件,当它出现在 Chrome 下载中时,被命名为“test.txt_” - 尾随下划线。我在 Firefox 中尝试过同样的事情,它似乎可以正确下载。不幸的是,告诉我们的大多数用户切换浏览器是行不通的。
我试过了:
corsheaders.middleware.CorsMiddleware
django.contrib.sessions.middleware.SessionMiddleware
django.middleware.locale.LocaleMiddleware
django.middleware.common.CommonMiddleware
django.middleware.csrf.CsrfViewMiddleware
django.contrib.auth.middleware.AuthenticationMiddleware
django.contrib.messages.middleware.MessageMiddleware
Run Code Online (Sandbox Code Playgroud)
到目前为止,其他人遇到的任何类似问题似乎都略有不同(即:Internet Explorer 删除了扩展中的句点并将其替换为下划线)。
对这里可能发生的事情有任何猜测吗?我有点难住了。
小智 9
您必须从文件名中删除“”
改成attachment; filename="filename.txt"attachment; filename=filename.txt
虽然看起来文件名中不能有空格
我终于明白这是怎么回事了。用于触发下载的 UI 是通过创建临时锚标记来实现的(请参阅此处的第二个答案:下载数据 url 文件)。当它这样做时,有两种不同的情况。在一种情况下,如果下载多个文件,它会将文件扩展名更改为 .zip。在另一种情况下,如果下载单个文件,它仍然尝试附加扩展名,但 UI 代码的编写方式是将扩展名设置为空字符串。所以最终的结果是添加了一个句点,但之后不再延长。例如,如果正在下载的文件是“test.txt”,那么它最终会是“test.txt”,然后在 Windows 上由 Chrome 转换为“test.txt_”,以使其成为有效的文件扩展名。
| 归档时间: |
|
| 查看次数: |
3511 次 |
| 最近记录: |