2016-11-15 89 views
0

我正在致力于Firefox的扩展,现在用JavaScript编写。本质上,当将鼠标悬停在图像的缩略图上时(点击该图像将您带到具有完整图像的网页),该扩展程序将查找完整图像的URL并尝试通过按键进行下载。 (在这个例子中是“D”)。我将使用的文件通常是.jpgs和.png,但是.swfs和.mp3s也可能存在。在这一点上,我只是想找到前两个文件类型的工作。通过Firefox使用Javascript下载图片?

我现在使用的代码只是

function ExtendedDownload(image_src) { 
    var a = document.createElement('a'); 
    document.body.appendChild(a); 
    a.download = image_src.split('/').pop().split('?')[0]; 
    a.href = image_src; 
    a.click(); 
} 
  1. image_src是URL的形象。
  2. a.download是从完整URL解析的图像的文件名。

之前在JavaScript文件中,当它看到一个有效的缩略图被光标悬停时,它会等待按键。这部分工作得很好。下载是我遇到的麻烦。

当加载到镀铬,该扩建工程完全按预期。然而,在Firefox(v49.0.2)中,它只是显示图像(类似于在地址栏中粘贴图像的链接并按下Enter键)。这不是预期的效果。

我测试过的一个解决方案是通过JavaScript将图像转换为base64,并试图下载,这在理论上是有效的,而且我测试过它会将base64转换为小的.png ..但是我试图下载的文件导致base64字符串的大小超过兆字节,并且发送浏览器挂起,所以这不是一个有效的选项。

我在stackexchange上遇到的类似问题的每个解决方案都让我回到了这个位置,然而,“下载”图像只是在浏览器中打开它。

任何建议,将不胜感激。

编辑:我遇到的问题肯定是基于这样一个事实,即我使用此扩展的网页和图像所在的网页位于不同的域。 @Mayank Pandeyz的解决方案让我相信这一点,因为当我尝试在页面本身的相同域上进行重新加载和映像时,它就像预期的那样工作。我有什么潜力解决这样的问题?

+0

听起来像是一个本地系统配置。也许你有像https://addons.mozilla.org/en-US/firefox/addon/open-in-browser/安装的东西? – Hailwood

回答

2

试试这个:

var a = document.createElement('a'); 
a.href = "/favicon.png"; 
a.download = "favicon.png"; 
document.body.appendChild(a); 
a.click(); 
document.body.removeChild(a); 

Demo Fiddle

+0

小提琴演示效果很好,试图将其实现到我的代码并不会改变我得到的最终结果。我不确定它与我所在的网站是https的事实有关,还是图像托管在与主页面不同的域上? – Azerai

1

,你可以做这样的jQuery中。在那里你给选择用户是否下载

或不

<a href="yourPath" class="download">download</a> 


$('.download').click(function(){ 
      var url = $(this).attr('href'); 
      $(this).attr("target", "_blank"); 
      window.open(url,'Download'); 
     }); 

这里是一个小提琴:https://jsfiddle.net/s1ojfbrt/2/

0

你的服务器应该有一个选项,用下面的响应头提供的图像:

Content-Type: application/octet-stream 
Content-Disposition: attachment; filename="picture.png" 

在这种情况下,浏览器将显示另存为...对话框。

你可以在服务器上有特殊的url /脚本。

+0

他正在为任意网站编写Firefox扩展。他无法控制服务器。 – Hailwood

+0

@Hailwood这是什么“我测试过的一个解决方案是将图像转换为base64 ...并试图下载它,”发生了什么? –

+1

我没有包括转换的代码,因为我没有保留它,一旦我确定它是一个糟糕的路线下来,但它本质上是一个js函数接受图像输入,并输出一个base64字符串您将分配给a.href而不是原始链接。 – Azerai