我决定使用前端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
}
我希望让代码更有效,并且实际上在做可靠的实施工作,我应该如何改进呢?
答案 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-store和google-cloud-storage将更加合适。它允许您直接将文件流式传输到Google,而无需使用中间存储。