【js】javascript大量ダウンロードpdf
2826 ワード
背景
最近は単独と一括でpdfのファイルをダウンロードする需要があります.単独でダウンロードしてまず思い付いたのはaタグのdownload属性で直接ダウンロードします.実際には、ブラウザはデフォルトでpdfファイルを開いています.直接ダウンロードするのではありません.大量ダウンロードは圧縮が必要で、このステップも先端で実現する必要があります.
ここに私の実現方法を記録します.ほとんどのファイルに適用されます.
準備工作
ここでは二つのnpmバッグを使いました. jszip file-saver
ダウンロード
単独でpdfをダウンロードして、file-saverだけでいいです.
何がBlobですかコンベヤー?ドア
今の状況はインターフェースがpdfのURLに戻りました.このurlでPDF対応のblobを取得します.
どうしますか?もちろん
ajax blobを取得する
コードを直接貼り付ける:
後で大量に使うために、
使用方法:
ダウンロード
まず、大量ダウンロードはzipパッケージに圧縮してダウンロードするので、
ここには一括ファイルをzipに圧縮する方法が書かれています.
単独でダウンロードするにはajaxを開始し、大量にダウンロードする必要があります.各URLにajaxを開始します.
前の
ダウンロードしました.
最近は単独と一括でpdfのファイルをダウンロードする需要があります.単独でダウンロードしてまず思い付いたのはaタグのdownload属性で直接ダウンロードします.実際には、ブラウザはデフォルトでpdfファイルを開いています.直接ダウンロードするのではありません.大量ダウンロードは圧縮が必要で、このステップも先端で実現する必要があります.
ここに私の実現方法を記録します.ほとんどのファイルに適用されます.
準備工作
ここでは二つのnpmバッグを使いました.
jszip
は圧縮用です.file-saver
は、フロントエンドにファイルを保存するためのものである.npm install file-saver jszip --save
インストールが完了したら、まず単独でダウンロードします.ダウンロード
単独でpdfをダウンロードして、file-saverだけでいいです.
import { saveAs } from 'file-saver';
function save() {
saveAs(blob, filename);
}
saveAs法には2つのパラメータがあり、2つ目のパラメータはダウンロードされたファイル名であり、1つ目のパラメータは比較的取りにくいBlob
オブジェクトである.何がBlobですかコンベヤー?ドア
今の状況はインターフェースがpdfのURLに戻りました.このurlでPDF対応のblobを取得します.
どうしますか?もちろん
ajax
です.ajax blobを取得する
コードを直接貼り付ける:
const getPdfBlob = (url: string) => {
return new Promise((resolve, reject)=> {
let xhr = new XMLHttpRequest()
xhr.open('get', url+'?t='+Math.random(), true);
xhr.setRequestHeader('Content-Type', `application/pdf`);
xhr.responseType = 'blob';
xhr.onload = function () {
if (this.status == 200) {
//
var blob = this.response;
resolve(blob);
}
}
xhr.send();
})
}
まず、1つの原生のXMLHttpRequest
を書いて、方法はgetで、urlの中のtパラメータはキャッシュを阻止するためです.その後、responseType
をblobとして設定し、最後に受信したのがblobデータです.後で大量に使うために、
getPdfBlob
関数の内部にpromiseで包んでみました.使用方法:
getPdfBlob(url).then(blob => {
saveAs(blob, filename);// blob pdf
})
単独でダウンロードできます.ダウンロード
まず、大量ダウンロードはzipパッケージに圧縮してダウンロードするので、
jszip
を使います.ここには一括ファイルをzipに圧縮する方法が書かれています.
import JSZip from 'jszip'
import { saveAs } from 'file-saver';
getMultiZip(blobs)=> {
var zip = new JSZip();
blobs.forEach(blob=> {
// pdf
zip.file(' pdf .pdf', blob, { binary:true });
})
zip.generateAsync({type:'blob'}).then(function(content) {
// zip
saveAs(content, ' pdf .zip');
});
}
この方法があったら、次にblobを大量に取得します.単独でダウンロードするにはajaxを開始し、大量にダウンロードする必要があります.各URLにajaxを開始します.
前の
getPdfBlob
はpromiseを包装していますので、ロット取得はこのように書けばいいです.Promise.all(
pdfUrlList.map(url=> getPdfBlob(url))
).then(res=> {
// res :[blob, blob, blob, ...]
getMultiZip(res)
})
ここでPromise.all
を使用する利点は、要求を並列に開始することができ、最後の要求が終わったら、すべてのblobを取得することであり、サイクル実行ajaxよりも効率的である.ダウンロードしました.