HTML5 下载属性不适用于 301 永久移动



我正在尝试从永久移动 301 的 URL 自动下载文件,如下所示:

<a href="myserverapi/download?fileId=123" download="image.jpg" target="_blank">Download</a>

但它不会自动下载图像。

相反,它仅在新选项卡上显示图像,而不是提供文件作为下载。

请建议任何其他方法。

与其在标记中使用download属性,不如考虑只更改响应标头。

在服务器的响应中,如果将Content-Disposition标头设置为attachment,就像@BadPiggie所说的那样,那么图像文件将下载而不是显示。

如果您选择像这样使用此标头,那么我相信不需要download属性。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition

正如您在评论中所说,

端点只是将 (301( 重定向到图像的 URL (someurl.com/image.jpg(

问题出在您的端点myserverapi/download?fileId=123中。因为端点会重定向你,而不是提供请求的文件。这意味着由于某种原因,URL 不允许您访问该文件。

也许,您正在使用临时 URL,因此它在过期后抛出301 error。所以你的HTML代码没有错!

所以..问题是链接在新选项卡中打开,这不是所需的行为?

如果是这种情况,请更改:

target="_blank"

target="_self"

目标空白强制在新选项卡中打开链接,请检查以下内容:https://www.w3schools.com/tags/att_a_target.asp

如果您有图像的完整路径,则可以使用一些服务器端脚本,重定向到此页面并从那里下载

$filename = "https://developers.google.com/homepage-assets/images/chromeos-logo.png";
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename. '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filename));
readfile($filename);

这将触发图像的下载,而不是打开它

假设问题正在处理同源链接,这种行为的一个可能原因是较旧的 Firefox 版本没有实现跨重定向传播文件名——该功能似乎已添加到 v78 和 v91 之间的某个地方,这很可能是在这个问题被问到之后。

在 v91 中,此块存在于HttpBaseChannel::SetupReplacementChannel函数中:

if (sameOriginWithOriginalUri) {
newChannel->SetContentDisposition(mContentDispositionHint);
if (mContentDispositionFilename) {
newChannel->SetContentDispositionFilename(*mContentDispositionFilename);
}
}

( 在 https://searchfox.org/mozilla-esr91/source/netwerk/protocol/http/HttpBaseChannel.cpp#4414 (

请注意,mContentDispositionFilename是在较早阶段分配download='...'属性值的。

然而,在 v78 中,这段代码不存在——见 https://searchfox.org/mozilla-esr78/source/netwerk/protocol/http/HttpBaseChannel.cpp#4098

相关内容

最新更新