そのため、ファイルがサーバーにアップロードされた後、ファイルをユーザーに提供しようとしています。アップロードされたファイルは、アプリケーション ディレクトリ内の uploads というディレクトリに保存しています。ファイルを提供するために使用しているコードは次のとおりです。
if (req.url.split("/")[1] == "uploads") {
console.log("requesting file " + virtualToPhysical(req.url));
var file = fs.readFile(virtualToPhysical(req.url), function (err, data) {
if (err) {
throw err;
} else {
res.writeHead(200, { 'Content-Type': mime.lookup(req.url) });
res.end(data, 'binary');
}
});
}
virtualToPhysical は、ファイル システム内のディレクトリへのパスをリクエスト URL に追加するだけです。req.url が「/uploads/image1.jpg」の場合、virtualToPhysical は「/path/to/application/uploads/image1.jpg」を吐き出します。mime.lookup() 呼び出しは、ファイルの正しい MIME タイプを推測する組み込みライブラリからのものです。
このコードはエラーなしで実行されます。応答ヘッダーは問題ないように見えますが、ファイルの種類やサイズに関係なく、本文は毎回空になります。util.pump() を使用して別の方法を試しましたが、同じ結果が得られます。
*編集: * 私はあちこち探し回っていますが、これは文字通り、ノード経由でファイルを提供するために人々が使用すると言う唯一の方法です。私の問題が何であるかについて途方に暮れています。res.end() を呼び出すときに「バイナリ」フラグを使用しないことを誰かが提案しましたが、何があっても同じ効果が発生します。