web-dev-qa-db-ja.com

ファイルをアップロードし、multerで追加のパラメーターを渡す

私は jQuery Form Plugin および multer ファイルをサーバーにアップロードします。これは問題なく機能しますが、ファイルを正確に保存する場所を決定する追加のパラメーターを渡そうとしています。

私は次のコードを持っていますが、それを拡張して、次のように動作させたいと思います。

HTML

<form id="uploadForm"
      enctype="multipart/form-data"
      action="/files"
      method="post">
    <input type="file" id="userFile" name="userFile"/>
    <input type="text" hidden id="savePath" name="savePath" value="path"/>
</form>

クライアントJS

uploadForm.submit(function() {
    $(this).ajaxSubmit({

        error: function(xhr) {
            console.log('Error: ' + xhr.status);
        },

        success: function(response) {
            console.log('Success: ' + response);
        }
    });

    return false;
});

Node.jsルート

app.post(APIpath + "file",function(req,res){
    var storage = multer.diskStorage({
        destination: absoluteServePath+ "/" + config.filePath,
        filename: function (req, file, cb) {
            cb(null, file.originalname);
        }
    });
    var upload = multer({ storage : storage}).any();

    upload(req,res,function(err) {
        if(err) {
            console.log(err);
            return res.end("Error uploading file.");
        }
        res.end("File has been uploaded");
    });
});

注:mimetypeをチェックしたり、ユーザーファイルをサニタイズしたりしていないことはわかっていますが、現時点では主にセカンダリです。

7
Clemens Himmer

問題は、最初にファイルを保存し、次にフォームの残りの部分(非表示フィールドなど)をmulterに書き込むreqです。

これを試して:

app.post(APIpath + "file",function(req,res){
    var storage = multer.diskStorage({
        destination: tmpUploadsPath
    });
    var upload = multer({ storage : storage}).any();

    upload(req,res,function(err) {
        if(err) {
            console.log(err);
            return res.end("Error uploading file.");
        } else {
           console.log(req.body);
           req.files.forEach( function(f) {
             console.log(f);
             // and move file to final destination...
           });
           res.end("File has been uploaded");
        }
    });
});
18
stdob--