Google chrome extension chrome.downloads.download忽略';url';

Google chrome extension chrome.downloads.download忽略';url';,google-chrome-extension,Google Chrome Extension,我试图写一个简单的扩展,将自动下载图像从我们公司的网站到一个目录。问题是chrome.downloads.download似乎忽略了“url”之后的每个参数。 它下载文件。但保留原始名称,并忽略子目录。如果文件已经退出,它将附加一个(#),而不是按照代码中的指定进行覆盖 我尝试了各种方法来实现传递给chrome.downloads.download的对象,包括创建一个包含所有参数的对象并传递该对象。我试过引用一些没有意义的话。 我尝试过重新格式化filename参数,甚至给它一个固定值“foo.

我试图写一个简单的扩展,将自动下载图像从我们公司的网站到一个目录。问题是
chrome.downloads.download
似乎忽略了“url”之后的每个参数。 它下载文件。但保留原始名称,并忽略子目录。如果文件已经退出,它将附加一个(#),而不是按照代码中的指定进行覆盖

我尝试了各种方法来实现传递给chrome.downloads.download的对象,包括创建一个包含所有参数的对象并传递该对象。我试过引用一些没有意义的话。 我尝试过重新格式化filename参数,甚至给它一个固定值“foo.jpg”。我在content.js和bs.js中都尝试过这样做。 我已确认文件名已传递到后台脚本,并且可以通过在后台脚本中显示
警报()
来访问该值

//Manifest.js (important parts)
"permissions": ["downloads","webNavigation"],
"background": {
    "scripts": ["bs.js"],
    "Persistent": false
    },
"content_scripts": [
    {
        "matches": ["<all_urls>"],
        "js": ["jquery-3.4.1.min.js"]
    },
    {
        "matches": ["https://mycompany.com/*"],
        "js": ["content.js"]
    }

    ]

//Content.js (important parts)
var $imgs = $('#spec_jpg img');
var url = "https:" + $imgs.attr('src');
var filename ="specificationArchive/" +  url.substring(url.lastIndexOf('/')+1); //edited
chrome.runtime.sendMessage({url: url, filename: filename});

//bs.js (whole thing)
chrome.runtime.onMessage.addListener(
    function(request, sender){
      chrome.downloads.download ( { url: request.url,
      filename: request.filename,
      conflictAction: "overwrite",
      saveAs: false }
      )
    }
);
//Manifest.js(重要部分)
“权限”:[“下载”,“网络导航”],
“背景”:{
“脚本”:[“bs.js”],
“持续”:假
},
“内容脚本”:[
{
“匹配项”:[“”],
“js”:[“jquery-3.4.1.min.js”]
},
{
“匹配项”:[“https://mycompany.com/*"],
“js”:[“content.js”]
}
]
//Content.js(重要部分)
var$imgs=$('spec#jpg img');
var url=“https:+$imgs.attr('src');
var filename=“specificationArchive/”+url.substring(url.lastIndexOf(“/”)+1)//编辑
chrome.runtime.sendMessage({url:url,filename:filename});
//bs.js(整件事)
chrome.runtime.onMessage.addListener(
功能(请求、发送方){
chrome.downloads.download({url:request.url,
filename:request.filename,
冲突操作:“覆盖”,
saveAs:false}
)
}
);

扩展名确实下载了该文件,但我希望它将其保存到名为specificationArchive的子目录中。我还希望它覆盖现有文件,而不是在名称的末尾附加(#)。即使在传递文件名的绝对字符串时,我也会得到文件的原始名称

wOxxOm提供的解决方案是添加一个额外的侦听器。下面是添加到bs.js的代码

//bs.js
chrome.downloads.onDeterminingFilename.addListener(function(item, suggest) {
suggest({filename: "specificationArchive/" + item.filename, conflictAction: 'overwrite'});
});
一旦包含了它,它就会保存到列出的目录中。
再次感谢。

请参阅
filename
参数的文档:“绝对路径、空路径和包含反向引用的路径”。“将导致错误”。感谢您的回复。我在最初的故障排除过程中确实读到了这一点,但它并不适用。代码不会抛出错误,文件也不会下载,只是没有指定名称。我尝试为
filename
使用各种值,以确保引用的是下载文件夹中的相对路径。我甚至在content.cs中尝试了
var filename=“foo.jpg”
,但它坚持使用原始文件名。我还尝试在bs.js中使用
文件名:“foo.jpg”
,以防某些信息传递不正确。原始文件名仍然保留。感谢您坚持我的意见。我使用绝对路径注意到错误,并在最初的故障排除过程中进行了更正。当我测试时,它被复制到了帖子上。前导斜杠未被忽略,因为它会引发错误,并且文件不会下载。如果没有它,或者即使行更改为
var filename=“foo.jpg”
文件也会下载并不会抛出错误,但不会使用路径。即使将bs.js行更改为
filename:'foo.jpg'
也不会更改行为,并且文件以原始名称保存。请尝试在chrome.downloads.onDeterminingFilename listener中提供文件名。就是那个!谢谢。现在我只想知道如何将这篇文章列为已解决的问题。:-)我是斯塔克福的新手。