【问题标题】:restify file upload - 500 error, socket is closed重新上传文件 - 500 错误,套接字已关闭
【发布时间】:2016-02-02 14:56:55
【问题描述】:

我正在使用 restify api 上传文件。

它给了我一个错误,

{
   "code": "InternalError",
    "message": "This socket is closed."
 }  

读取的 api 仍然可以正常工作,但无法上传图像。可能是什么问题?

我使用的代码,

exports.uploadfile = function (req, res, next) {
  var file_name = req.files.image.name;                
  var file_name_arr = file_name.split('.');
  var imageExtension = file_name_arr.pop();
  var imageName = Date.now()+"."+imageExtension;
  var newPath = process.cwd() + "/images/" + imageName;

  fs.readFile(req.files.image.path, function (err, data) {
    fs.writeFile(newPath, data, function (err){
      if(err) return next(err);
      res.json({
        image: imageName
      })
      return next();
    });                
  });
}

【问题讨论】:

  • 您是否使用单独的模块来处理文件上传?
  • 使用 fs - 上传文件。
  • 我刚刚使用 fs.rename 做了一个简单的测试来移动临时文件,无论节点应用程序是否在后台运行,它都能完美运行。你能展示一下你是如何使用 fs 来移动文件的吗?

标签: node.js restify


【解决方案1】:

经过一番挖掘,我在这里找到了答案。上面的代码将整个文件读入内存,然后写入速度很慢的磁盘上。相反,我使用流媒体来编写文件,它就像一个魅力。

将上述代码中的 fs.readfile 替换为

rr = fs.createReadStream(req.files.image.path).pipe(fs.createWriteStream(imagePath))

rr.on('error', function(err){
   console.log(error)
});

rr.on('finish', function(){
   //do ur work here
});

参考链接:https://nodejs.org/api/stream.html

其他方法是使用 fs.rename,它比上面指定的方法更快,因为它根本不需要读取文件。

fs.rename(req.files.image.path, new_file_path);

【讨论】:

  • 使用 fs.rename 会更快。它根本不需要读入文件。需要注意的是,它可能无法跨文件系统工作,因此如果您正在写入或从 NFS 挂载写入,则可能会出现问题。
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
相关资源
最近更新 更多