google-chrome - 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 中尝试过同样的事情,它似乎可以正确下载。不幸的是,告诉我们的大多数用户切换浏览器是行不通的。
我试过了:
- 强制使用不同的内容类型(例如:代替“application/octet-stream”,尝试“application/text”,看看会发生什么)。这没有效果。
- 格式化内容配置略有不同(例如:分号和文件名之间的空格)。这也没有效果。
- 删除了 content-disposition 标头中文件名周围的双引号。没有效果。
- 在 Rest Framework 本身中删除断点,但 Visual Studio Code 似乎不会触发这些。(我对通过 Visual Studio Code 进行调试不是很熟悉,所以这可能是我的错)。
- 剥离了任何自定义中间件,所以剩下的唯一中间件如下:
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 删除了扩展中的句点并将其替换为下划线)。
对这里可能发生的事情有任何猜测吗?我有点难过。
解决方案
我终于弄清楚这里发生了什么。用于触发下载的 UI 是通过创建临时锚标记来实现的(请参阅此处的第二个答案:下载数据 url 文件)。当它这样做时,它有两种不同的情况。在一种情况下,如果下载多个文件,它会将文件扩展名更改为 .zip。在另一种情况下,如果下载单个文件,它仍然会尝试附加扩展名,但 UI 代码的编写方式是将扩展名设置为空字符串。所以最终结果是添加了一个句点,但之后没有扩展。例如,如果正在下载的文件是“test.txt”,它会以“test.txt.”结尾,然后在 Windows 上由 Chrome 转换为“test.txt_”,使其成为有效的文件扩展名.
推荐阅读
- javascript - `TypeError: env.getState` 使用 jest 使用选择器测试整个 redux 传奇时出错
- laravel - 在 Laravel 8 中存储数据并同时更新不同表上的数据
- javascript - 无限自动播放滑块 React js
- javascript - 在Angular中将毫秒格式化为dd:hh:mm:ss
- javascript - 错误: SMTPConnection._formatError 处的连接超时\n
- c++ - 必须仅使用 C++ 中的静态对象初始化 constexpr 引用吗?
- usbserial - CH340 具有用于柴油加热器和树莓派的自定义波特率
- authentication - 使用 Appium 的基本身份验证 Codeceptjs
- kubernetes - 如何导致单个 kubernetes pod 的有意重启
- javascript - 从下拉列表中选择后未加载 Json 文件