web-dev-qa-db-ja.com

ファイル名に手ごわいフォーム値を解析します

NodeJでファイルのアップロードを処理するために手ごわいものを使用しています。フィールド値の解析に少し行き詰まっています。

Project_idの値をフォームハンドラーに取得して、ファイル名にパラメーターを書き込むにはどうすればよいですか?

<input type="text" id="project_id" value="{{projects._id}}" readonly>

[〜#〜]編集[〜#〜]

具体的には、フォームアップロード処理の詳細を以下に示します。

app.post('/uploads/', function (req, res){
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
        res.writeHead(200, {'content-type': 'image/jpeg'});
        res.write('received upload: \n\n');
        var project = fields.project_id;
        res.end(util.inspect(project, {fields: fields, files: files}));
    });

    form.on('end', function(project, fields, files){ 
        console.log(project); 
        /*Temporary location of our uploaded file */
        var temp_path = this.openedFiles[0].path;
        /*The file name of the uploaded file */
        var file_name =  project + '.' + this.openedFiles[0].name;

var projectの部分にform.parseを記録できます。しかし、form.on('end'...の部分に変数がありません。

HTMLフォーム

<form   id="uploadForm"
    enctype="multipart/form-data"
    action="/uploads/"
    method="post">
    <input type="text" name="project_id" id="project_id" value="{{projects._id}}" readonly>
    <input multiple="multiple" type="file" name="upload" />
    <button type="submit">Upload</button>
</form>
6
Wandkleister

Formidableのendコールバックはパラメータを取りませんが、parseコールバックを使用している場合は、呼び出す必要があるかどうかさえわかりません。私はあなたが探しているものはこのようなものだと思います:

_var fs = require('fs');
app.post('/uploads', function(req, res, next) {
    var form = new formidable.IncomingForm();
    form.parse(req, function(err, fields, files) {
        if (err) next(err);

        // TODO: make sure my_file and project_id exist    
        fs.rename(files.my_file.path, fields.project_id, function(err) {
            if (err) next(err);
            res.end();
        });
    });
});
_

次のように、parseコールバックを使用しないことを選択した場合は、end()イベントをリッスンする必要があります。

_new formidable.IncomingForm().parse(req)
    .on('file', function(name, file) {
        console.log('Got file:', name);
    })
    .on('field', function(name, field) {
        console.log('Got a field:', name);
    })
    .on('error', function(err) {
        next(err);
    })
    .on('end', function() {
        res.end();
    });
_
5
Andrew Lavers

クライアント側のスクリプト:

    //Upload the file
    var fd = new FormData();
    //Take the first selected file
    fd.append("dbDocPath", 'invoices/' + file.name);
    fd.append("file", file);
    $http({
            method: 'POST',
            url: $rootScope.apiUrl + 'uploadDocToServer',
            data: fd,
            headers: {
                'Content-Type': undefined
            },
            //prevents serializing payload.  don't do it.
            transformRequest: angular.identity,
        }).success(function (response) {
           if (response.success) {
           }
   })

サーバーサイドスクリプト:

var fileDir = path.join(__dirname, '/../uploads');

// create an incoming form object
var form = new formidable.IncomingForm();
var dbDocPath = '';
form.parse(req)
        .on('field', function (name, field) {
            //console.log('Got a field:', field);
            //console.log('Got a field name:', name);
            dbDocPath = field;
        })
        .on('file', function (name, file) {
            //console.log('Got file:', name);

            // specify that we want to allow the user to upload multiple files in a single request
            //form.multiples = true;

            // store all uploads in the /uploads directory
            form.uploadDir = fileDir;

            fs.rename(file.path, path.join(form.uploadDir, file.name));

            // every time a file has been uploaded successfully,
            // rename it to it's orignal name

            var bucket = new AWS.S3();
            //console.log(dbDocPath);

            var params = {
                Bucket: DocsConfig.bucketName,
                Key: dbDocPath,
                Body: fs.createReadStream(path.join(form.uploadDir, file.name)),
                ACL: 'public-read'
            };

            bucket.putObject(params, function (perr, pres) {
                if (perr) {
                    //console.log("Error uploading data: ", perr);
                } else {
                    fs.unlinkSync(path.join(form.uploadDir, file.name));
                    //console.log("Successfully uploaded data", pres);
                }
            });
        })
        .on('error', function (err) {
            res.send({'success': false, error: err});
        })
        .on('end', function () {
            res.send({'success': true});
        });
// parse the incoming request containing the form data
//form.parse(req);

ファイルのアップロードには運命にアップロードするためのパスが必要であるため、formData()にパラメーターを送信するシーケンスは上記のコードで説明したものと同じである必要があることに注意してください。

2
Rahul Mankar