我目前正在为Google Chrome创建一个扩展程序,可以将所有图像或链接保存到硬盘上的图像上。Chrome扩展程序:如何将文件保存到磁盘上
问题是我不知道如何使用JS或Google Chrome扩展API在磁盘上保存文件。
你有想法吗?
我目前正在为Google Chrome创建一个扩展程序,可以将所有图像或链接保存到硬盘上的图像上。Chrome扩展程序:如何将文件保存到磁盘上
问题是我不知道如何使用JS或Google Chrome扩展API在磁盘上保存文件。
你有想法吗?
您可以使用HTML5 FileSystem features使用Download API写入到磁盘。这是将文件下载到磁盘的唯一方式,且受到限制。
你可以看看NPAPI插件。另一种做你需要的方法是简单地通过XHR POST向外部网站发送请求,然后通过另一个GET请求来检索返回的文件,这将显示为保存文件对话框。
例如,对于我的浏览器扩展My Hangouts我创建了一个实用程序直接下载从HTML5画布照片到磁盘。你可以看看这里的代码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(':');
如果你想转换一个URI到HTML5的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);
};
然后在用户点击下载按钮后,它将使用“下载”HTML5 File API将BLOB URI下载到文件中。
由于Javascript搭便车连接到您的计算机的网页从任何地方,让它有能力写入到您的磁盘是危险的。
这是不允许的。您是否认为Chrome扩展程序需要用户互动?否则它可能属于同一类别。
有没有办法,我知道的默默的文件保存到用户的驱动器,这是它看起来像你希望做的事。我想,你可以要求文件的同时要保存一个使用类似(提示用户每次):
function saveAsMe (filename)
{
document.execCommand('SaveAs',null,filename)
}
如果你想仅提示用户一次,你可以静静地抓住所有的图像,将它们压缩成一个包,然后让用户下载它。这可能意味着在所有文件上执行XmlHttpRequest,在Javascript中压缩它们,将它们上传到暂存区域,然后询问用户是否想下载zip文件。听起来很荒唐,我知道。
有在浏览器本地存储选项,但他们只对开发者的使用,在沙箱中,据我所知。 (例如Gmail离线缓存)。请参阅Google最近的公告,如this one。
只适用于互联网浏览器 – 2011-01-30 20:20:31
考虑使用HTML5 FileSystem features使写入使用Javascript可能文件。
我做了,做这样的事情,如果有人在这里仍有意扩展。 它使用XMLHTTPRequest获取对象,在这种情况下,该对象被假定为图像,然后创建一个ObjectURL对象,指向该对象的链接,然后单击想象的链接。
拉斯普京?尼斯... – chb 2012-08-10 04:31:53
第一个链接命中404 – therealprashant 2017-08-21 05:56:54
我一直希望为自己制作一个扩展程序来批量下载图像。然而,每次我都感到沮丧,因为唯一看似适用的选择是NPAPI,而铬和Firefox似乎都不再需要支持。
我建议那些仍然希望实现'保存文件磁盘'功能的人看看这个Stackoverflow post,这篇文章下面的评论帮了我很多。
现在自铬31+,chrome.downloads
API变得稳定。我们可以使用它来以编程方式下载文件。如果用户未在chrome设置中设置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.hk/images/srpr/logo11w.png";
chrome.downloads.download({url:imgurl},function(downloadId){
console.log("download begin, the downId is:" + downloadId);
});
虽然它是Chrome仍然会在下载完成时不提供Event
可惜。当下载begin
成功(没有完成)chrome.downloads.download
的回调函数被调用
官方文档大约chrome.downloads
是here。
这不是我最初的想法,但我在这里张贴希望它可能对某人有用。
不知道2014年,但到今天为止,有可能听到'onChanged'事件,该事件带有可以告诉下载状态的状态对象(例如“完成” )。 – JSmyth 2016-04-18 21:38:57
@Allan,Re“*我们可以保存文件而不会提示用户确认*”;但是当你开始将文件写入用户的机器时,不会打开底部的“下载栏”?有没有什么办法可以静静地做到这一点? (例如,如果您在后台向用户机器写入50个文件) – Pacerier 2016-08-18 11:24:38
@Pacerier它是调用下载架,当我编写答案时,我记得我必须手动禁用在高级选项页面中显示的架子。我做了一些搜索,我发现这个:你可能很有趣.'setShelfEnabled' 'chrome.downloads.setShelfEnabled(boolean enabled)' 启用或禁用与当前浏览器配置文件关联的每个窗口底部的灰色格架。只要至少有一个分机禁用了分机,该分机就会被禁用。在至少有一个其他扩展禁用的情况下启用机箱时,它将通过runtime.lastError返回错误。 – 2016-08-18 12:00:35
这不是我们第一次将我重定向到NPAPI。我会看看它。感谢您的帮助 – 2010-01-29 07:31:23
请注意,如果您打算将扩展程序上传到Google的画廊,那么使用NPAPI将会延迟发布,以便他们进行长时间审阅,甚至可能无法接受。 – 2010-01-29 07:37:04
我同意Max。它会延迟发布,因为它将被手动审查。如果您有一台外部服务器,您可以在扩展程序中授予访问权限,并通过POST上传数据,并通过具有适当标头的GET取回数据,那将是最好的选择。 – 2010-01-30 23:50:08