Chrome扩展程序:如何将文件保存在磁盘上

我目前正在创build一个谷歌浏览器的扩展,它可以保存所有图像或链接到硬盘上的图像。

问题是我不知道如何用JS或Google Chrome扩展API保存磁盘上的文件。

你有想法吗?

您可以使用HTML5 FileSystemfunction使用下载 API写入磁盘。 这是将文件下载到磁盘的唯一方法,并且是有限的。

你可以看看NPAPI插件。 另一种做你需要的方法是简单地通过XHR POST向外部网站发送请求,然后通过另一个GET请求来取回文件,这将作为保存文件对话框出现。

例如,对于我的浏览器扩展程序“ 我的环聊”,我创build了一个实用程序,可以将HTML5 Canvas中的照片直接下载到磁盘。 你可以看看这里的代码capture_gallery_downloader.js这样做的代码是:

var url = window.webkitURL || window.URL || window.mozURL || window.msURL; var a = document.createElement('a'); a.download = 'MyHangouts-MomentCapture.jpg'; a.href = url.createObjectURL(dataURIToBlob(data.active, 'jpg')); a.textContent = 'Click here to download!'; a.dataset.downloadurl = ['jpg', a.download, a.href].join(':'); 

如果你想在HTML5中实现将URI转换为Blob,那么我是这么做的:

 /** * Converts the Data Image URI to a Blob. * * @param {string} dataURI base64 data image URI. * @param {string} mimetype the image mimetype. */ var dataURIToBlob = function(dataURI, mimetype) { var BASE64_MARKER = ';base64,'; var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; var base64 = dataURI.substring(base64Index); var raw = window.atob(base64); var rawLength = raw.length; var uInt8Array = new Uint8Array(rawLength); for (var i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } var bb = new this.BlobBuilder(); bb.append(uInt8Array.buffer); return bb.getBlob(mimetype); }; 

然后,用户点击下载button后,将使用“下载”HTML5文件API将BLOB URI下载到文件中。

我一直希望为自己做一个扩展程序来批量下载图像。 然而,每次我感到沮丧,因为唯一看似适用的选项是NPAPI,铬和Firefox似乎都不再支持。

我build议那些仍然想实现“保存在磁盘上的文件”function的人看看这个Stackoverflow的post ,这篇文章下面的评论帮助了我很多。

现在自铬31+, chrome.downloads API变得稳定。 我们可以使用它来以编程方式下载文件。 如果用户没有在chrome设置的ask me before every download提前选项ask me before every download设置ask me before every download ,我们可以保存文件,而不会提示用户确认!

这是我使用的(在扩展的后台页面):

  // remember to add "permissions": ["downloads"] to manifest.json // this snippet is inside a onMessage() listener function var imgurl = "https://www.google.com.hkhttp://img.dovov.comsrpr/logo11w.png"; chrome.downloads.download({url:imgurl},function(downloadId){ console.log("download begin, the downId is:" + downloadId); }); 

尽pipe可惜chrome在下载完成时仍然不提供Eventchrome.downloads.download的callback函数在下载成功(未完成)时被调用,

关于chrome.downloads官方文档在这里 。

这不是我最初的想法,但是我在这里贴出来希望这对某个人有用。

我不知道如何将文件悄悄地保存到用户的驱动器中,这就是您希望执行的操作。 我认为你可以询问文件一次保存一个(每次提示用户)使用类似的东西:

 function saveAsMe (filename) { document.execCommand('SaveAs',null,filename) } 

如果您只想提示用户一次,则可以静静地抓取所有图像,将其压缩成一束,然后让用户下载。 这可能意味着在所有文件上执行XmlHttpRequest,在Javascript中压缩它们,将它们上传到暂存区域,然后询问用户是否要下载zip文件。 听起来很荒唐,我知道。

浏览器中有本地存储选项,但据我所知,它们仅供开发人员在沙盒中使用。 (例如,Gmail离线caching)。请参阅Google最近的公告。

考虑使用使用Javascript写入文件的HTML5文件系统function 。

Google网上商店
Github上

我做了一个扩展,做这样的事情,如果有人在这里仍然感兴趣。 它使用一个XMLHTTPRequest来抓取对象,在这种情况下,这个对象被认为是一个图像,然后创build一个ObjectURL到ObjectUrl的链接,并点击虚构的链接。

由于JavaScript与任何地方的网页搭配使用网页,因此给它写入磁盘的能力是很危险的。

这不被允许。 您是否认为Chrome扩展程序需要用户互动? 否则它可能属于同一类别。