2017-12-29 9 views
1

私はポストハンドラのアップロードとマルチタの一意のIDにshortidを使用しています。Node.js multerとshortidを使用した各アップロードの一意のフォルダ

私はいくつかの入力と画像をアップロードしています。私は各アップロードが "upload/XXXXX"内に保存されるようにしたいと思います。 私はapp.post(...)上で一意のIDを生成しています。このIDをmulterに送信する方法を知りたいと思います。

グローバル変数を使用すると、同時に2つの投稿が正しく行われても問題はありますか?

var Storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
    callback(null, path.join(__dirname, 'uploads', XXXXX)); //Unique id for file is the same as Folder 
    }, 
    filename: function (req, file, callback) { 
    callback(null, XXXXX); //Unique id 
    } 
}); 

var upload = multer({ 
    storage: Storage 
}).single('pic'); 

//tell express what to do when the route is requested 
app.post('/fbshare', function (req, res, next) { 
    let ui = shortid(); 
    upload(req, res, function (err) { 
    if (err) { 
     return res.end("Something went wrong!"); 
    } 
    return res.end("File uploaded sucessfully!."); 
    }); 
}); 

app.post()からStorageにパススルーする方法はありますか?または、あなたがより良い解決策を持っているなら、私はすべて耳にします。


最終解決

var Storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
    fs.mkdir(path.join(__dirname, 'uploads', req.ui), function(){ 
     callback(null, path.join(__dirname, 'uploads', req.ui)); 
    }); 
    }, 
    filename: function (req, file, callback) { 
    callback(null, req.ui + file.originalname.substring(file.originalname.indexOf('.'), file.originalname.length)); 
    } 
}); 

var upload = multer({ 
    storage: Storage 
}).single('pic'); 

//tell express what to do when the route is requested 
app.post('/fbshare', function (req, res, next) { 
    req.ui = shortid(); 
    upload(req, res, function (err) { 
    if (err) { 
     return res.end("Something went wrong!"); 
    } 
    return res.end("File uploaded sucessfully!."); 
    }); 

}ありがとう)。

+0

と同じことが、あなただけのreqオブジェクトから値を渡すことができませんか? –

+0

フィールドの1つを置き換えるか、req.bodyに追加するのと同じですか? –

+0

ええ、基本的に受け入れられた答えは言った;) –

答えて

0

これはいかがですか?

app.post('/fbshare', function (req, res, next) { 
    req.ui = shortid(); // create the id in the request 
.... 

はその後multer

var Storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
    callback(null, path.join(__dirname, 'uploads', req.ui)); //Unique id for  
.... 

filename

+0

私はそれが私のjavascriptの知識だと思う、私はちょうどオブジェクト内のフィールドを追加することができ、また、req.bodyがapp.post()の内部で空であるため、requestオブジェクトの使用は考えられませんでした。 multerだけで体を見ることができますが、req.ui作品があります!私はそれがない場合、multerはフォルダを作成しないので、私はそこにファイルを移動しようとする前に、フォルダを作成する必要があるので、私はアップロードが完了していないと思います。したがって、 "エラー:ENOENT:そのようなファイルやディレクトリはありません。 '/.../uploads/HyAfAbX7z/HyAfAbX7z" –

+0

私はそれを編集できるので、あなたの問題は私の直面している問題を解決しました:)これは、宛先コールバックの前にfs.mkdir()を使用する必要があるという別の問題を引き起こしました。 –

+0

'req'b​​odyは' multer'ミドルウェアが動作する前に 'req.body'が空であった場合、' req'オブジェクトはそれらを関数に渡すときにはそのまま残ります。なぜなら、あなたは常にオブジェクトの参照をjavascript。はい 'multer'はフォルダを作成せず、' fs.mkdir'の代わりに 'mkdirp'を使うべきです。 – neo

関連する問題