記事一覧はこちら

期待のchrome拡張api chrome.downloads

今まで任意のファイルをDLさせようと思うと、chrome.webRequestで書き変えたり、 a要素のダウンロード属性で指定したりしましたが一番シンプルに行う方法が提供されそうです。 確認したgoogle ChromeのバージョンはVersion 25.0.1346.0 canary。

それはchrome.downloads.downloadchrome.downloads.download({url:"http://url.com"},function(e){dir(e)}); でダウンロードが開始され、しかもダウンロードバーが表示されません。ダウンロードバーが表示されないのは便利だと思うしいいのかと疑問にも思う。 第一引数で指定するオブジェクトについてまとめてみました。urlは必須。それ以外は任意。

body(任意 文字列) methodでPOSTを指定した時に有効。postされるbody。 headersで[{name:"Content-Type",value:"application/x-www-form-urlencoded"}]と指定しないと、PHPの$_POST等で取得できないから注意

saveAs(任意 真偽値) ファイル保存のダイアログを表示する。

url(必須 文字列) ダウンロードされるURL

filename(任意 文字列) 保存されるファイル名。拡張子も指定しないといけない。

headers(任意 オブジェクトの配列) 任意のヘッダーを送信出来る。が、referer等変更できないヘッダもある。 例:[{name:"Content-Type",value:"application/x-www-form-urlencoded"}]

method(任意 文字列) メソッド。"GET"か"POST"のどちらか

フルで指定するとこんな感じです

chrome.downloads.download(
    {
        body:"key=value",
        saveAs:true,
        url:"http://url.com",
        filename:"保存されるファイル名.jpg",
        headers:[{name:"Content-Type",value:"application/x-www-form-urlencoded"}],
        method:"POST"
    }
,function(e){dir(e)});

ファイル名についての仕様がややこしかったので調べました まずはheader('Content-Disposition: attachment; filename="テスト.zip"');が送信されている場合、filename:"save.zip"の値は使われません。 saveAs:falseの場合は"テスト.zip"が保存されるし、saveAs:trueの場合でも表示されるファイル保存ダイアログのデフォルト値は"テスト.zip"です。

次にheader('Content-Disposition: attachment; filename="テスト.zip"');が送信されていない場合。 例えば、header('Content-Disposition: attachment;');の場合はfilename:"save.zip"が有効に働きます。 saveAs:falseの場合"save.zip"が保存されますし、saveAs:trueの場合に表示されるファイル保存ダイアログのデフォルト値は"save.zip"です。

つまり、ファイル名の優先度は saveAs:trueで表示されるファイル保存ダイアログに入力したファイル名>レスポンスヘッダ Content-Dispositionのfilename>chrome.downloads.downloadの第一引数のオブジェクトのfilenameの値 となります。

filename:"save.exe"等の保存時に確認が必要な拡張子を指定した場合の処理もきちんと行われており、ユーザーの確認が必要です。 ただ、ダウンロードバーが表示されないのでsaveAs:falseの場合はchrome://downloads/を開く必要があります。

その他に頭の片隅に置いておく事は bodyはmethodを"POST"にしてheadersで[{name:"Content-Type",value:"application/x-www-form-urlencoded"}]と指定しないと、PHPの$_POST等で取得出来ない。 headersはreferer等変更不可能なヘッダもある。エラーが出るから注意。 refererヘッダは送信されない。空白で送信ではなく、送信されない。 こんな感じです。

chrome.downloads.*はdevバージョン搭載だから、実際に使えるのは2013年の1月後半くらい?楽しみ。

おまけ。今までに行った全てのDL情報を表示する chrome.downloads.search({},function(e){dir(e)})