ローカルの保存先をスクリプト側から操作することは難しいですが、ユーザーがブラウザで設定しているダウンロードホルダにダウンロードするという用途に限って言えば、可能です。
phpで、下記のような、ファイル名(パス含む)を受ければ、ダウンロードする仕組みを作って、それに対してjavascriptから、XMLHttpRequest();で、ファイル名(パス含む)を連続投入してやればできます。
php
1<?php
2$filename=$_GET['filename'];
3
4if(isset($_GET['filename'])){
5 header('Content-Type: application/octet-stream');
6 header('Content-Disposition: attachment; filename='.$filename.'');
7 header('Content-Length: '.filesize($filename));
8 readfile($filename);
9}
10?>
ただ、1000以上のファイルを、、、一回のクリックでダウンロードしたように見せる。ギミックが必要なのかどうかは、依頼者さんともう一度相談された方が良いのではと思います。
1000以上のファイルのリスト(2000?とか3000?)から、ユーザーが必要なものを選択する。という動作があるのでしたら、上でyambejpさんが説明されている方法で選んだ時点でダウンロードするのと、なんら変わらないような気がします。最後にまとめてダウンロードする
ボタンをクリックする手間が、もうワンクリックですが増えることになりますし、1000回分のリクエストを待つというユーザー側の時間的コストも増えますし、サーバー側も連続してリクエストを受けることになります。
追記です。
yambejpさんの説明で、aタグのdownload属性でダウンロードできるということを知りましたので、javascriptだけで作ってみました。
IEは、download属性が効かないので無理みたいです。(持ってないのでわかりません。w)
※ただ、ダウンロード時にダイアログが出るか出ないかは、ブラウザに設定があるみたいです。
下記、multi_download()
を、フォームから値を拾って、ぶん回すなりの工夫をすればよろしいのではと思います。
html
1<!doctype html>
2<html lang="ja">
3<head>
4 <meta charset="utf-8">
5 <title>Multi Download Sample</title>
6 <script>
7 function multi_download() {
8 download("1.jpg");
9 download("2.jpg");
10 download("3.jpg");
11 download("4.jpg");
12 download("5.jpg");
13 }
14 function download(name) {
15 // chrome,firefox ただし、毎回確認ダイアログが出るかどうかはブラウザの設定による。
16 var a = document.createElement('a');
17 a.download = name;
18 a.href = name;
19 document.body.appendChild(a);
20 a.click();
21 document.body.removeChild(a);
22 }
23 </script>
24</head>
25<body>
26<button type="button" onclick="multi_download();">マルチダウンロード</button>
27</body>
28</html>