NPM Multer 未返回任何响应
NPM Multer returning no response
我正在尝试使用 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/
我哪里弄错了?如果文件上传也失败了,我该如何追踪?
@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>');
}
});
});
希望对您有所帮助。
因为目标是创建具有目录和文件名动态参数的单个函数。至此问题已解决。
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'});
});
现在它在错误情况下也能正确返回响应。文件正在上传到参数中传递的动态路径。
我正在尝试使用 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/
我哪里弄错了?如果文件上传也失败了,我该如何追踪?
@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>');
}
});
});
希望对您有所帮助。
因为目标是创建具有目录和文件名动态参数的单个函数。至此问题已解决。
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'});
});
现在它在错误情况下也能正确返回响应。文件正在上传到参数中传递的动态路径。