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() 时不要使用 'binary' 标志,但无论如何都会产生相同的效果。

4

2 回答 2

0

从您对;的调用中删除'binary'参数 res.end()encoding参数仅在您发送字符串时适用,并且在这种情况下您正在发送缓冲区。此外,'binary'在最近版本的 node.js 中作为编码类型被删除。

于 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 回答