2014-09-06 10 views
6

Próbuję przesłać dowolny plik, używając Multer package. Działa to dobrze, gdy używam następującego kodu w pliku server.js.Jak ustawić różne miejsca docelowe w nodejach za pomocą multera?

var express = require('express'), 
    app = express(), 
    multer = require('multer'); 
app.configure(function() { 
    app.use(multer({ 
     dest: './static/uploads/', 
     rename: function (fieldname, filename) { 
      return filename.replace(/\W+/g, '-').toLowerCase(); 
     } 
    })); 
    app.use(express.static(__dirname + '/static')); 
}); 

app.post('/api/upload', function (req, res) { 
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name}); 
}); 

var server = app.listen(3000, function() { 
    console.log('listening on port %d', server.address().port); 
}); 

Co chcę, to przechowywać plik w różnych lokalizacjach. Próbowałem podążać za kodem, ale to nie działa dla mnie.

var express = require('express'), 
    app = express(), 
    multer = require('multer'); 
app.configure(function() { 
    app.use(multer({ 
     //dest: './static/uploads/', 
     rename: function (fieldname, filename) { 
      return filename.replace(/\W+/g, '-').toLowerCase(); 
     } 
    })); 
    app.use(express.static(__dirname + '/static')); 
}); 

app.post('/api/pdf', function (req, res) { 
    app.use(multer({ dest: './static/pdf/'})); 
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name}); 
}); 

app.post('/api/image', function (req, res) { 
    app.use(multer({ dest: './static/image/'})); 
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name}); 
}); 

app.post('/api/video', function (req, res) { 
    app.use(multer({ dest: './static/video/'})); 
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name}); 
}); 

var server = app.listen(3000, function() { 
    console.log('listening on port %d', server.address().port); 
}); 

Znaczy, jeśli uderzę http://localhost:3000/api/pdf plik należy zapisać w folderze „pdf”, jeśli uderzę http://localhost:3000/api/video plik należy zapisać w folderze „wideo”.

Czy jest jakiś sposób osiągnięcia tego celu?

Z góry dziękuję.

+0

od teraz nie jest możliwe z "multer". https://github.com/expressjs/multer/issues/58 to jest odpowiedź, którą otrzymałem od "właściciela". – AkshayP

+4

Rozwiązane - https://github.com/jpfluger/multer/blob/examples/multer-upload-files-to-different-directories.md – AkshayP

Odpowiedz

9

Aktualizacja

sporo rzeczy się zmieniło od czasu, kiedy pisał oryginalną odpowiedź .

Z multer 1.2.1.

  1. Trzeba użyć DiskStorage określić gdzie & jak z zapisanego pliku.
  2. Domyślnie multer użyje domyślnego katalogu systemu operacyjnego. W naszym przypadku, ponieważ jesteśmy szczególnie zainteresowani lokalizacją. Musimy upewnić się, że folder istnieje, zanim będziemy mogli zapisać plik tam.

Uwaga: Jesteś odpowiedzialny za stworzenie katalogu, podając cel jako funkcję.

Więcej here

'use strict'; 

let multer = require('multer'); 
let fs = require('fs-extra'); 

let upload = multer({ 
    storage: multer.diskStorage({ 
    destination: (req, file, callback) => { 
     let type = req.params.type; 
     let path = `./uploads/${type}`; 
     fs.mkdirsSync(path); 
     callback(null, path); 
    }, 
    filename: (req, file, callback) => { 
     //originalname is the uploaded file's name with extn 
     callback(null, file.originalname); 
    } 
    }) 
}); 

app.post('/api/:type', upload.single('file'), (req, res) => { 
    res.status(200).send(); 
}); 

fs-extra do tworzenia katalogu, just in case if it doesn't exists

Original odpowiedź

Można użyć changeDest.

Funkcja do zmiany nazwy katalogu, w którym umieszczane są przesłane pliki.

Jest on dostępny od v0.1.8

app.post('/api/:type', multer({ 
dest: './uploads/', 
changeDest: function(dest, req, res) { 
    var newDestination = dest + req.params.type; 
    var stat = null; 
    try { 
     stat = fs.statSync(newDestination); 
    } catch (err) { 
     fs.mkdirSync(newDestination); 
    } 
    if (stat && !stat.isDirectory()) { 
     throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"'); 
    } 
    return newDestination 
} 
}), function(req, res) { 
    //set your response 
}); 
+0

dzięki. działa –

8

Multer jest middleware więc można przekazać to tak:

app.post('/test/route', multer({...options...}), module.someThing) 

lub

app.post('/test/route', multer({...options...}), function(req, res){ 
........some code ...... 
}); 
1

Można utworzyć funkcję tak:

var uploadFnct = function(dest){ 
     var storage = multer.diskStorage({ //multers disk storage settings 
      destination: function (req, file, cb) { 
       cb(null, './public/img/'+dest+'/'); 
      }, 
      filename: function (req, file, cb) { 
       var datetimestamp = Date.now(); 
       cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]); 
      } 
     }); 

     var upload = multer({ //multer settings 
         storage: storage 
        }).single('file'); 

     return upload; 
    }; 

a następnie używać go w trasie Dodano:

//Handle the library upload 
    app.post('/app/library/upload', isAuthenticated, function (req, res) { 
     var currUpload = uploadFnct('library'); 
     currUpload(req,res,function(err){ 
      if(err){ 
       res.json({error_code:1,err_desc:err}); 
       return; 
      } 
      res.json({error_code:0,err_desc:null, filename: req.file.filename}); 
     }); 
    }); 
+0

Jesteś odpowiedzialny za stworzenie katalogu, podając 'destination' jako funkcję. Przekazując ciąg, multer upewni się, że katalog został utworzony dla ciebie. – Bishan

+0

To działa bardzo dziękuję :) – CELB

0

I sprawdzone rozwiązania pokazane tutaj, ale nic nie pomogło mnie.

ChangeDest atr nie jest już dostępne (Jak Sridhar proponuje w swojej odpowiedzi)

chcę podzielić się moją rozwiązanie (używam wyraźnej 4.13 i multer 1.2):

Import:

var express = require('express'); 
var router = express.Router(); 
var fs = require('fs'); 
var multer = require('multer'); 


bagażu zmienna (patrz dokumentacja here)

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
     var dest = 'uploads/' + req.params.type; 
     var stat = null; 
     try { 
      stat = fs.statSync(dest); 
     } catch (err) { 
      fs.mkdirSync(dest); 
     } 
     if (stat && !stat.isDirectory()) { 
      throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"'); 
     }  
     cb(null, dest); 
    } 
}); 


Inicjowanie Multer:

var upload = multer(
    { 
     dest: 'uploads/', 
     storage: storage 
    } 
); 


Używanie go!

router.use("/api/:type", upload.single("obj")); 
router.post('/api/:type', controllers.upload_file); 
0
var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    if (req.path.match('/pdf')) { 
     cb(null,<destination>) 
    } 
    }, 
    filename: function (req, file, cb) { 
    } 
}) 

Działa to w przypadku ścieżka jest wyjątkowy. Możesz modyfikować (sprawdzając punkt końcowy {req.path}) zgodnie z Twoimi potrzebami. Chociaż to rozwiązanie nie jest dynamiczne.

Powiązane problemy