如何使用Node.js Express后端正确处理文件上传?

时间:2014-10-19 16:54:19

标签: javascript node.js angularjs google-cloud-storage multipart

我决定使用前端ng-flow的Angular实现flow.js处理文件上传,然后选择 multer 作为中间件来接收文件。

我为multer做了最简单的中间件设置:

app.use(multer({ dest: './temp_uploads/'}))

获得/POST upload路线,我现在正在登录以控制收到的内容:

app.route('/upload').post(function(request,response,next){

    console.log(request.body)
    console.log(request.files)
    // Response code and stuff then ...
});

所以输出是:

{ flowChunkNumber: '1',
  flowChunkSize: '1048576',
  flowCurrentChunkSize: '1606857',
  flowTotalSize: '1606857',
  flowIdentifier: '1606857-IMG_20140807_153553jpg',
  flowFilename: 'IMG_20140807_153553.jpg',
  flowRelativePath: 'IMG_20140807_153553.jpg',
  flowTotalChunks: '1' }
{ file: 
   { fieldname: 'file',
     originalname: 'blob',
     name: 'c12d6f8d4950e48eee21b43f8ee4344a',
     encoding: '7bit',
     mimetype: 'application/octet-stream',
     path: 'temp_uploads/c12d6f8d4950e48eee21b43f8ee4344a',
     extension: '',
     size: 1606857,
     truncated: false,
     buffer: null }}

实际上,所有内容都保存在我的服务器上,正如/temp_uploads所述。但文件不会保留其名称,甚至不会扩展。我想知道我应该做些什么来好好配置它,甚至可以防止服务器出现问题。

为了以防万一,我将解释我想对文件做些什么。收到后,我会将它们存储到Google云端存储平台。然后我将这些文件作为附件邮寄,如果文件大于15 MB,我将包含一个可以通过邮件下载的链接。

flow.js 网站上,他们会显示这个用于处理服务器文件的PHP代码段,但由于我的PHP背景很差,因此翻译代码并不是我可靠的选择:< / p>

$config = new \Flow\Config();
$config->setTempDir('./chunks_temp_folder');
$file = new \Flow\File($config);

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if ($file->checkChunk()) {
        header("HTTP/1.1 200 Ok");
    } else {
        header("HTTP/1.1 404 Not Found");
        return ;
    }
} else {
  if ($file->validateChunk()) {
      $file->saveChunk();
  } else {
      // error, invalid chunk upload request, retry
      header("HTTP/1.1 400 Bad Request");
      return ;
  }
}
if ($file->validateFile() && $file->save('./final_file_name')) {
    // File upload was completed
} else {
    // This is not a final chunk, continue to upload
}

我希望让代码更有效,并且实际上在做可靠的实施工作,我应该如何改进呢?

1 个答案:

答案 0 :(得分:1)

  

实际上,所有内容都保存在我的服务器上,在/ temp_uploads下应该保存。但文件不会保留其名称,甚至不会扩展。我想知道我应该做些什么来好好配置它,甚至可以防止服务器出现问题。

您可以按照multer README.md中的示例控制命名。我已将其包括在内:

app.use(multer({
    dest: './uploads/',
    rename: function (fieldname, filename) {
        return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
    }
}))

看起来还有很多其他的钩子。

另见cloud-storage模块。您可以使用它将数据推送到Google。

基于此构建的{p> abstract-blob-storegoogle-cloud-storage将更加合适。它允许您直接将文件流式传输到Google,而无需使用中间存储。