NPM Multer没有回复

时间:2016-09-24 07:59:19

标签: node.js npm multer

我正在尝试使用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/

我错了哪里?如何跟踪文件上传是否也失败?

2 个答案:

答案 0 :(得分:0)

@Sankalp,我检查了代码并使其工作,但没有用于格式化文件名的所有逻辑(请稍后重新实现)。

由于您在此处未提供您提交的表单中的代码,因此我认为重要的是说它必须包含enctype="multipart/form-data",否则它无效。

此外,type="file"的输入必须具有idname属性,其值为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传递的动态路径。