首页 > 解决方案 > Windows 上的 Chrome 在下载的文件中添加尾随下划线?

问题描述

我遇到了一个相当奇怪的情况,我很难在现有的 Django 应用程序中追踪。从 APIView 继承的视图之一在用户进行 POST 调用时返回一个文件。端点工作正常,但是当下载的文件到达客户端机器时发生了一些奇怪的事情。当浏览器接收到文件时,文件扩展名已被重命名为尾随下划线。(所以假设文件最初是“test.txt”,客户端收到的版本是“test.txt_”)。

据我所知,就在 APIView 中返回响应对象之前,内容类型和内容处置标头看起来是正确的。例如:

Content-Type: application/octet-stream
Content-Disposition: attachment;filename="test.txt"

同一个文件,当它出现在 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

到目前为止,其他人遇到的任何类似问题似乎都略有不同(即:Internet Explorer 删除了扩展中的句点并将其替换为下划线)。

对这里可能发生的事情有任何猜测吗?我有点难过。

标签: google-chromehttp-headers

解决方案


我终于弄清楚这里发生了什么。用于触发下载的 UI 是通过创建临时锚标记来实现的(请参阅此处的第二个答案:下载数据 url 文件)。当它这样做时,它有两种不同的情况。在一种情况下,如果下载多个文件,它会将文件扩展名更改为 .zip。在另一种情况下,如果下载单个文件,它仍然会尝试附加扩展名,但 UI 代码的编写方式是将扩展名设置为空字符串。所以最终结果是添加了一个句点,但之后没有扩展。例如,如果正在下载的文件是“test.txt”,它会以“test.txt.”结尾,然后在 Windows 上由 Chrome 转换为“test.txt_”,使其成为有效的文件扩展名.


推荐阅读