2016-09-24 10 views
0

npm multerを使用してファイルをアップロードしようとしています。問題は、multerがエラーではなく応答を返さないということです。私はファイルアップロードのためのアプリケーション全体のための共通の機能を作成しようとしました。 私はすべての(777)私のフォルダへのアクセス権も持っています。NPM Multerが応答を返さない

私のサンプルコードはです。

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/

?ファイルのアップロードにも失敗した場合はどうすれば追跡できますか?

答えて

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で渡された動的パスにアップロードされます。

0

@Sankalp、コードをチェックして動作させましたが、ファイル名をフォーマットするすべてのロジックではありません(後で再実装してください)。

あなたが提出しているフォームのコードをここに含めなかったので、私はそれがenctype="multipart/form-data"を持っていなければならないと言うことが重要だと思います。そうでなければ動作しません。

また、type="file"と入力NodeJSコード内.single()関数に渡されたものと値とidname属性を持たなければなりません。これは識別子として機能するので、動的ではない方がよい(または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

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>'); 
     } 
    }); 
}); 

はそれがお役に立てば幸いです(私はExpressは、それをテストするために使用しました)

+0

私が提供したソリューションに同意します。私はあなたが言及した形式で同じ機能を事前に書いていました。しかし、私が修正するのは、私は動的なディレクトリパスとファイル名(現在のバージョン)を渡し、動作を停止します。私のフロントエンドコードはあなたが書いたものと同じです。 – Sankalp

+0

@Sankalpは、動的パスで動作するように変更されていますが、エラーはありますか?ファイルが正しいパスに保存しようとしていますか?別のオプションは2つ(またはあなたが望む数だけ)異なる 'diskStorage()'を各パスに1つずつ持つことです。次にapp.post()の中であなたが使いたいものを制御します。 – Tom

+0

私はすべてを持っている、フォルダが存在する場合でもパスは有効です。しかし、彼らはマルター機能からの応答はありません。エラーでもありません。これが私がデバッグできない理由です。 'diskstorage'についてどのようなオプションが言及されているのかを確認しましょう。しかし、私は、マルター関数からの応答がエラーか真かのいずれかを期待しています。 – Sankalp

関連する問題