0

そのため、ファイルがサーバーにアップロードされた後、ファイルをユーザーに提供しようとしています。アップロードされたファイルは、アプリケーション ディレクトリ内の 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() を呼び出すときに「バイナリ」フラグを使用しないことを誰かが提案しましたが、何があっても同じ効果が発生します。

4

2 に答える 2

0

;'binary'への呼び出しから引数を削除します。res.end()このencodingパラメーターは、文字列を送信する場合にのみ適用できます。この場合は、バッファーを送信します。また、'binary'最近のバージョンのノードでは、エンコーディングタイプとして削除されました。

于 2012-08-13T03:49:36.540 に答える
0

問題はfs.readFileファイルを開くことではなく、アップロード時にファイルを保存する方法であることがわかりました。アップロードを手ごわいものから保存するときに使用する代わりにfs.writeFile()、/tmp内の場所から名前を変更する必要があります。次に例を示します。

form.parse(req, function (err, fields, files) {
  file_name = escape(files.upload.name);
  fs.rename(files.upload.path, virtualToPhysical("/uploads/" + file_name), function (err) {
    if (err) {
      throw err;
    } else {
      res.writeHead(200, {'Content-Type': 'text/html'});
      res.end(file_name);
    }
  });
});
于 2012-08-13T23:51:31.793 に答える