Nodejsでダウンロードが成功したかどうかを確認する方法

WBOY
リリース: 2023-05-17 09:31:06
オリジナル
791 人が閲覧しました

NodeJS はサーバー側で動作する JavaScript プログラミング言語であり、その登場により Web アプリケーションの開発が大幅に容易になりました。多くの NodeJS アプリケーションの中でダウンロードは最も一般的な操作であり、ダウンロードが成功したかどうかをどのように検証するかは Web 開発では避けられない問題でもあります。この記事では、NodeJSを使ってダウンロードが成功したかどうかを確認する方法を紹介します。

NodeJS では、http、https、request、およびその他のモジュールを使用してファイルをダウンロードできます。 http または https モジュールを使用すると、リモート ファイルをダウンロードしてローカルに保存できますが、リクエスト モジュールはより高度で、リダイレクト、ドメイン名取得、Cookie などの操作を自動的に処理できます。

どのモジュールを使用しても、ファイルのダウンロードが成功したか失敗したかに関係なく、ダウンロードのステータスは返されたオブジェクトの statusCode 属性によって判断できます。 statusCode が 200 に等しい場合は、ダウンロードが成功したことを意味し、statusCode が他の値に等しい場合は、ダウンロードが失敗したことを意味します。

たとえば、http モジュールを使用してファイルをダウンロードします。

const http = require('http');
const fs = require('fs');

const file = fs.createWriteStream("file.pdf"); // 创建文件写入流
const request = http.get("http://example.com/file.pdf", function(response) {
    response.pipe(file); // 将响应数据写入文件
    console.log("statusCode: ", response.statusCode); // 输出状态码
});
ログイン後にコピー

上記のコードでは、応答が正常に返されると、そのデータは file.pdf ファイルとステータス コードに保存されます。が印刷されます。 statusCode が 200 の場合、ダウンロードが成功したことを意味します。ダウンロードが失敗した場合は、「エラー」イベントをリッスンして処理する必要があります。

http モジュールと比較して、リクエスト モジュールのダウンロード検証がより便利になります。例:

const fs = require('fs');
const request = require('request');

const file = fs.createWriteStream('file.pdf'); // 创建文件写入流
request.get('http://example.com/file.pdf') // 发送请求
    .on('response', function(response) { // 监听响应事件
        if(response.statusCode == 200) { // 判断响应状态码
            response.pipe(file); // 将响应数据写入文件
        }
    })
    .on('error', function(error) { // 监听下载错误事件
        console.log(error);
    });
ログイン後にコピー

この例では、request.get メソッドを使用してリクエストを送信し、「応答」イベントをリッスンしてダウンロードが成功したかどうかを判断します。応答の statusCode が 200 の場合、ダウンロードが成功したことを意味します。ダウンロードの失敗も、「エラー」イベントをリッスンして処理する必要があります。

大きなファイルをダウンロードする場合、ダウンロードの進行状況が気になる場合があります。リクエスト モジュールは、「データ」イベントをリッスンしてダウンロードの進行状況を計算することで、ダウンロードされた各データを取得できます。

たとえば、約 100MB のファイルをダウンロードします:

const fs = require('fs');
const request = require('request');

const file = fs.createWriteStream('file.pdf'); // 创建文件写入流
const url = 'http://example.com/file.pdf';
let receivedSize = 0;

const req = request.get(url); // 发送请求
req.on('data', function(data) { // 监听数据事件
    receivedSize += data.length; // 计算已接收的文件大小
    const progress = (receivedSize / req.response.headers['content-length']) * 100; // 计算下载进度
    console.log('progress:', progress.toFixed(2) + '%'); // 打印下载进度
})
.on('error', function(error) { // 监听下载错误事件
    console.log(error);
})
.pipe(file); // 将响应数据写入文件
ログイン後にコピー

この例では、req.response.headers['content-length'] を使用してファイルの合計サイズを取得します。受信したデータ量と合計ファイル サイズを計算して、ダウンロードの進行状況を取得します。同時に、req.on('data') イベントを使用してデータ ストリームを監視し、ダウンロードされた各データを取得します。

ダウンロードが成功したことを確認する際に、ファイルの整合性も確認する必要がある場合があります。 NodeJS では、fs モジュールが提供するメソッドを使用して、ファイル ハッシュの作成、ハッシュの比較などを行い、ファイルの MD5 値をチェックしてファイルの整合性を確認することもできます。

たとえば、ダウンロードしたファイルの MD5 値を確認します:

const fs = require('fs');
const crypto = require('crypto');

const file = 'file.pdf';
const expectedHash = '9d7d60e575578bcf5c0754510d105efa'; // 文件的期望MD5值
const hash = crypto.createHash('md5');
const stream = fs.createReadStream(file);

stream.on('data', function(data) {
    hash.update(data); // 更新哈希值
});
stream.on('end', function() {
    const digest = hash.digest('hex'); // 获取文件哈希值
    console.log('digest:', digest);
    console.log('hash comparison:', (expectedHash === digest)); // 比较期望的文件哈希值和实际哈希值
});
ログイン後にコピー

この例では、fs.createReadStream メソッドを使用してファイル ストリームを取得し、crypto.createHash('md5 によって作成します) ') stream.on('data') イベントを使用してハッシュ値を継続的に更新する MD5 ハッシュ オブジェクト。ファイルのストリーミングが完了すると、実際のファイルのハッシュ値が hash.digest('hex') によって取得され、最後に期待されるハッシュ値と実際のハッシュ値が比較されてファイルの整合性が検証されます。

ファイルをダウンロードする場合、ダウンロードが成功したことを確認することは最初のステップにすぎず、ファイルの整合性を確認することがデータのセキュリティを確保する鍵となります。上記で紹介した方法により、ダウンロードの成功と NodeJS 内のファイルの整合性を迅速に検証できるため、Web アプリケーションのセキュリティと安定性が向上します。

以上がNodejsでダウンロードが成功したかどうかを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート