I am trying to download a file (image) from a URL via a Chrome Extension using chrome.downloads, but for some reason chrome.downloads
is undefined
(getting the warning: Cannot read property 'download' of undefined
). I am basing my attempt on example from Google.
My test-extension does not have any popup, just a basic manifest and an extremely simply JavaScript file.
manifest.json:
{
"manifest_version": 2,
"name": "Testing chrome.downloads.download",
"version": "0.0.1",
"permissions": [
"activeTab",
"downloads",
"<all_urls>"
],
"content_scripts": [{
"matches": [
"http://www.example.com/*"
],
"js": [
"jquery.js",
"index.js"
]
}]
}
index.js:
$(document).ready(function () {
link = 'http://example.com/image.jpg';
chrome.downloads.download({
url: link,
filename: './' + link.substr(link.lastIndexOf('/')+1),
saveAs: false
});
});
So, how can I make this work?
So after some research i see content scripts dont directly support downloads, but you can pass message to your background page which supports download. The reason i included background page was to be able to see the console ;) you can try to directly goto background.js
manifest.json
{
"name": "Download static images",
"description": "Downloads images defined with <img> tag from watched webpage(s) by injecting a script",
"version": "1.0",
"browser_action": {
"default_icon": "debuggerPause.png",
"default_title": "get page html"
},
"background": {
"page": "background.html"
},
"content_scripts": [
{
"matches": ["http://stackoverflow.com/*"],
"js": ["main.js"]
}
],
"permissions": [
"tabs",
"background","downloads"
],
"manifest_version": 2
}
main.js
function getHtml() {
var pagehtml = document.documentElement;
var imgs=pagehtml.getElementsByTagName( 'img' );
var pass_array=[];
for (i in imgs){
pass_array.push(imgs[i]["currentSrc"]);
}
console.log(pass_array);
var param = {collection : pass_array};
chrome.runtime.sendMessage(param);
};
getHtml();
background.js
chrome.runtime.onMessage.addListener(
function(arg, sender, sendResponse) {
var args=arg.collection;
for (i in args){
var img_url=args[i];
try{
saveas=img_url.replace(/[^a-zA-Z0-9]/g,'-');
}
catch (problem){
}
chrome.downloads.download({
url: img_url,
filename: saveas,
saveAs: false
});
}
});
function sendResponse(){
}
backgroundpage.html
<script src="background.js"></script>
you can't use many chrome. methods including .downloads from a content script. use a background or events page together with extension messaging, or directly from an extension popup.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With