2012-08-13 65 views
0

所以我试图在文件上传到服务器后将文件提供给用户。我将上传的文件存储在应用程序目录中的一个名为uploads的目录中。这里是我用来提供文件的代码:使用node.js从文件系统提供文件,响应正文返回为空

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类型。

此代码无任何错误地运行。响应标题看起来没问题,但每次都会返回空白,无论文件类型或大小如何。我试过另一种方法usinng util.pump(),但产生相同的结果。

* 编辑: *我一直在寻找所有的人,这实际上是人们说用来为节点提供文件的唯一方法。我不知道我的问题可能是什么。有人建议在调用res.end()时不要使用'binary'标志,但无论如何都会产生相同的效果。

回答

0

从您的电话中删除'binary'参数res.end(); encoding参数仅适用于发送字符串的情况,在这种情况下,您正在发送缓冲区。另外,'binary'在最近的节点版本中作为编码类型被丢弃。

+0

我已经试过这与二进制参数和没有,都产生相同的结果。 – Chairmonkey 2012-08-13 09:08:13

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); 
    } 
    }); 
}); 
相关问题