当第一个参数是文件时,为什么上传文件失败?

时间:2019-02-21 05:44:49

标签: node.js file-upload append multer formidable

我在nodejs中有问题。 我希望能解决这个问题。

我在文件上传时使用了multer和可怕的功能。

如果我发送append [文件,字符串,字符串],则发生错误 但更改顺序后追加[字符串,文件,字符串]或[字符串,字符串,文件],然后成功上传文件。

我认为,第一个参数是附加文件,因此会发生错误。

这是可怕的消息来源。

const form = new formidable.IncomingForm();

var path = top_path;

form.encoding = 'utf-8';
form.uploadDir = './file';
form.multiples = true;
form.keepExtensions = true;     //확장자 표시

var fields = [];
var files = [];
var fields_array = [];
var files_array = [];


form.on('field', function(field, value){

        form.uploadDir = path;
        fields.push([field, value]);
        fields_array.push(value);


}).on('file', function(field, file){

    files.push([field, file.name]);
    files_array.push(file_name);

})


form.on('end', function(){
    console.log('총 파일 업로드 갯수 ==', this.openedFiles.length);

    console.log('---------<fields>---------');
    for(var i = 0; i<fields_array.length; i++){
        console.log('fields['+i+']: '+fields_array[i]);
    }

    console.log('---------<files>---------');
    for(var i = 0; i<files_array.length; i++){
        console.log('files['+i+']: '+files_array[i]);
    }

    console.log('---------<end>---------');


    var trans_object ={
        'field' : fields_array,
        'file' : files_array
    }

    res.send(trans_object);


    fields = [];
    files = [];
    fields_array = [];
    files_array = [];

}).on('error', function(error){
    console.error(error);
})


form.parse(req, function(err, field, file){
    console.log('[parse()] error: '+err +', field : '+field+', file : '+file);
    console.log('upload success..');
})

这是multer源。

var storage = multer.diskStorage({
    destination: function (req, file, next) {
        // next(null, './uploads')
        var path = req.body.path;
        next(null, path);
    },
    filename: function (req, file, next) {
        var originalFilename = file.originalname.split(".");    
        var extension = originalFilename[1].toLowerCase();      
        var filename = originalFilename[0];

        file_name = Date.now() +"_"+ filename  + "." + extension;  //save filename
        next(null, file_name);


    }
}),
upload = multer({
    storage: storage,
    limits:{fileSize: 100*1024*1024}
}),
fUpload = upload.fields([{
    name: 'input_file',
    maxCount: 10
}])

var file_upload = async () => {
    return new Promise((resolve, reject) => {
        fUpload(req, res, function (err) {
            if (err) {
                console.log(err.message);
                resolve(err.message);
            } else {

                var file = file_name;
                if(file_count > 0)file = file_arr;

                var data = {
                    path:path,
                    filename : file
                }

                console.log(data);

                resolve(data);
                return true;
            }
        });
    });
}

let uploader = async () =>{
    let rtn_upload = await file_upload();
    res.send(rtn_upload);
}
uploader();

如果我在文件中使用了第一个参数,则文件上传失败。

例如

var form = new FormData();
form.append("input_file", $("input[name=input_file]")[0].files[0]);
form.append("path", $("#path").val());
form.append("filename", $("#filename").val());

然后在nodejs中未定义主体中的此路径和文件名。

但是在文件之外使用了第一个参数,然后成功上传了文件。

例如

var form = new FormData();
form.append("path", $("#path").val());
form.append("filename", $("#filename").val());
form.append("input_file", $("input[name=input_file]")[0].files[0]);

原来是吗?还是我已经用代码解决了这个问题?

0 个答案:

没有答案