为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

万千封印 2022-10-13 15:44:56
我正在尝试使用 301 Moved Permanently 从 URL 自动下载文件,如下所示:<a href="myserverapi/download?fileId=123" download="image.jpg" target="_blank">Download</a>但它不会自动下载图像。相反,它只在新选项卡上显示图像,而不是提供文件作为下载。请建议任何其他方式
查看完整描述

4 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

正如你在评论中所说,

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

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

也许,您使用的是Temporary URL,所以它301 error在过期后抛出。因此,您的 HTML 代码没有任何问题!


查看完整回答
反对 回复 2022-10-13
?
九州编程

TA贡献1785条经验 获得超4个赞

您可以考虑只更改响应标头,而不是使用download标记中的属性。

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

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

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


查看完整回答
反对 回复 2022-10-13
?
侃侃无极

TA贡献2051条经验 获得超10个赞

假设问题是处理同源链接,则此行为的一个可能原因是较旧的 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


查看完整回答
反对 回复 2022-10-13
?
皈依舞

TA贡献1851条经验 获得超3个赞

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


$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);

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


查看完整回答
反对 回复 2022-10-13
  • 4 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信