この記事では、Node がファイルをローカルに一括ダウンロードする方法 (コード付き) を紹介します。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。
複数のファイルを個別に処理する
ファイルの数が制御可能で、ダウンロードされたファイル形式の要件がない場合は、最も簡単な方法を使用して、ファイルを直接走査できます。各ダウンロード リンクは、単一ファイルのダウンロード リンクまたは iframe ダウンロード リンクを作成します。
zip パッケージのバッチ ダウンロード
すべてのファイルを走査してから個々のファイルをバッチでダウンロードすることは可能ですが、このエクスペリエンスは結局のところあまり良いものではありません。アプローチは、バッチ ファイルをダウンロードして zip にパッケージ化することです。
したがって、最初の実装アイデアは次のとおりです。プロキシ サービスでは、最初にすべてのファイルを走査してファイル データを要求し、次にそれを zip パッケージに圧縮してから、zip パッケージをクライアントに返します。
ダウンロード ボリューム データが比較的小さい場合はこれで問題ありませんが、バッチ ファイルが非常に大きい場合、ユーザーはバックグラウンドですべてのデータが要求され、圧縮パッケージにパッケージ化されるまで待つ必要があります。フロントエンドはフィードバックを提供できますが、これには時間がかかり、ユーザー エクスペリエンスが低下する可能性があります。
同僚の予備調査中に、ここにストリーミング圧縮とダウンロード機能がある可能性があると言われていましたが、一般的なアイデアは、パッケージをチャンクバックしてストリーミング圧縮を追加することです。
...... let fileCounter = 0; const zippedFilename = encodeURIComponent(downloadData.name); const list = downloadData.list || []; const header = { 'Content-Type': 'application/x-zip', 'Pragma': 'public', 'Expires': '0', 'Cache-Control': 'private, must-revalidate, post-check=0, pre-check=0', 'Content-disposition': 'attachment; filename="' + zippedFilename + '"', 'Transfer-Encoding': 'chunked', 'Content-Transfer-Encoding': 'binary' }; res.writeHead(200, header); archive.store = true; archive.pipe(res); list.map(item => { fileCounter++; let inStream = request.get(item.downLoadUrl); let name = item.fileName; let length = 0; inStream.on('response', function(awsData) { archive.append(inStream, { name: name }); }).on('data', function(data) { length += data.length; }).on('error', function(e) { console.error(name + '-error', e); }).on('end', function(endData) { fileCounter--; if (fileCounter < 1) { archive.finalize(); } }); }); archive.on('error', function(err) { throw err; }); archive.on('finish', function(err) { return res.end(); }); ......
もちろん、中国語のファイル名の問題、ダウンロードされるファイルの合計サイズを制限する必要があるかどうか、ファイルが存在しないかどうかなど、まだ対処する必要がある詳細がいくつかあります。 、など。
以上がNodeがローカルにファイルを一括ダウンロードする方法の紹介(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。