我正在尝试使用npm multer
上传文件。问题是multer没有回复,甚至没有错误。我试图为整个应用程序创建文件上传的通用功能。 我对我的文件夹也拥有所有(777)权限。
我的示例代码是。
var uploadFile = require('../../utilities/common').uploadFile;
exports.uploadVehicle = function (req, res) {
console.log('\nUploading File');
console.log(dirPath.vehicleFarm);
uploadFile(dirPath.vehicleFarm, 'csvFile', function (err) {
console.log('\tError:');
console.log(err);
if (err)
return res.status(err.status || 400).json({code: err.status || 400, message: err.message || 'Unable to process request.'});
var data = req.body;
console.log(data.csvFile);
res.status(200).json({status: 200, message: 'File saved successfully'});
});
};
公共文件中的uploadFile
函数就像这样提到。
var multer = require('multer');
var path = require('path');
var fs = require('fs');
var filePath = path.resolve(__dirname, '..');
var storage = function (inputDir, fieldName) {
console.log('Input from storage to path - ' + inputDir);
console.log(filePath + '/uploads/' + inputDir);
return multer.diskStorage({
destination: function (req, file, cb) {
cb(null, filePath + '/uploads/' + inputDir);
},
filename : function (req, file, cb) {
var dateTimeStamp = Date.now();
req.body[fieldName] = file.fieldname + '-' + dateTimeStamp + '.' + file.originalname.split('.')[file.originalname.split('.').length - 1];
console.log(req.body[fieldName]);
cb(null, req.body[fieldName]);
}
});
};
exports.uploadFile = function (inputDir, fieldName) {
return multer({storage: storage(inputDir, fieldName)}).single(fieldName);
};
即使文件夹也存在,输入路径也有效路径是 - /home/sony/Desktop/node/all/db/uploads/tempCSV/vehicleFarm/
我错了哪里?如何跟踪文件上传是否也失败?
答案 0 :(得分:0)
@Sankalp,我检查了代码并使其工作,但没有用于格式化文件名的所有逻辑(请稍后重新实现)。
由于您在此处未提供您提交的表单中的代码,因此我认为重要的是说它必须包含enctype="multipart/form-data"
,否则它无效。
此外,type="file"
的输入必须具有id
和name
属性,其值为NodeJS代码中.single()
函数的值。它可以作为标识符使用,因此最好不要动态(或者你也必须在HTML中动态设置它)。
NodeJS代码非常简单,我认为没有问题。
结果工作代码在这里:
<强> HTML 强>
<form method="POST" action="file" enctype="multipart/form-data">
<input type='file' id='csv_file' name='csv_file' value='Choose file' />
<br>
<input type='submit' value='Save' />
</form>
NodeJS (我已使用Express对其进行测试)
var storageFile = multer.diskStorage({
destination: function (req, file, cb) {
var even = Date.now() % 2;
if (even == 0) {
console.log("Save in dir_a");
callback(null, 'files/dir_a');
} else {
console.log("Save in dir_b");
callback(null, 'files/dir_b');
}
},
filename: function (req, file, cb) {
console.log('Setting the filename.');
var filename = "File_" + Date.now().toString().substring(0, 11) + ".csv";
cb(null, filename);
}
});
var uploadFile = multer({storage: storageFile }).single('csv_file');
app.post('/file', function(req, res) {
console.log('-------------------------------------------');
console.log('>>> POST - Submitted page: ' + req.url + ' <<<');
console.log('-------------------------------------------');
uploadFile(req, res, function(err) {
if (err) {
res.send('<h1>Error to upload file ' + err + '</h1>');
} else {
res.send('<h1>File ' + req.file.filename + ' successfully uploaded</h1>');
}
});
});
希望它有所帮助。
答案 1 :(得分:0)
由于目标是使用动态参数创建目录和文件名的单个函数。问题已解决。
var dirPath = require('./directory-path').dirPath;
var multer = require('multer');
var path = require('path');
var fs = require('fs');
var filePath = path.resolve(__dirname, '..');
exports.uploadFileToPath = function (directory, fieldName) {
this.uploadFile = multer({
storage: multer.diskStorage({
destination: function (req, file, cb) {
console.log('In Destination - ');
cb(null, filePath + '/uploads/' + directory);
},
filename : function (req, file, cb) {
var dateTimeStamp = Date.now();
req.body[fieldName] = file.fieldname + '-' + dateTimeStamp + '.' + file.originalname.split('.')[file.originalname.split('.').length - 1];
console.log(req.body[fieldName]);
cb(null, req.body[fieldName]);
}
})
}).single(fieldName);
};
我需要调用此函数,我将其实例化为
var common = require('../../utilities/common');
var uploadVehicle = new common.uploadFileToPath(dirPath.vehicleFarm, 'csvFile');
uploadVehicle.uploadFile(req, res, function (err) {
if (err) {
console.log('\tError:');
console.log(err);
return res.status(err.status || 400).json({code: err.status || 400, message: err.message || 'Unable to process request.'});
}
var data = req.body;
console.log('File Name --- ' + data.csvFile);
//if (data.length === 0)
// return callback({status: 400, message: 'Bad request. No record found.'});
res.status(200).json({status: 200, message: 'File saved successfully'});
});
现在它在错误情况下正确返回响应。文件正在上传到params传递的动态路径。