2017-01-02 3 views
0

Я пишу приложение-узел, и я искал что-то для загрузки файлов на сервер. Я мог бы загружать файлы, когда был только один статический каталог. Но мне нужно создавать каталоги для каждого пользователя, а затем загружать файлы в них, в соответствии с пользователем, который вошел в систему. Я выглядел, но все, что я делаю, заканчивается ошибкой: ENOENT: нет такого файла или каталога, open ... error , То, что я пытаюсь сделать, в настоящее время это -multer: динамический путь назначения

let storage = multer.diskStorage({ 
    destination: function(req, file, cb) { 
    let dest = path.join(__dirname, './documents', 'somenameigetfromtheuser'); 
    let stat = null; 
    try { 
     stat = fs.statSync(dest); 
    } 
    catch (err) { 
     fs.mkdirSync(dest); 
    } 
    if (stat && !stat.isDirectory()) { 
     throw new Error('Directory cannot be created'); 
    } 
    cb(null, dest); 
    } 
}); 

let upload = multer({ 
    storage: storage, 
    dest: 'documents/' 
}); 

app.post('/testUpload', upload.single('testfile'), (req, res) => { 
    res.json({ 
    test: 'test' 
    }) 
}); 

Существует similar question, который был дан ответ, но он не работает, что путь для меня, потому что я хочу, чтобы имя каталога из объекта запроса.

Когда я удаляю свойство хранилища в инициализации мультера, файлы хранятся в каталоге документов со случайным именем. Я хочу, чтобы файл имел свое первоначальное имя, и я хочу, чтобы он хранился в каталоге, где я получаю имя каталога из объекта req.
Помогите брату, спасибо!

+0

См отредактированный ответ (это подходит для меня). –

ответ

0

В моем проекте я использую multer следующим образом:

1.СОХРАНЕНИЕ этот файл первым в общем каталоге, например,/TMP /.

2.Copy/перемещение файла в любом месте, в CDN в моем случае, и в папку пользователя в вашем.

3. Исключить исходный файл в/tmp, если необходимо.

И, может быть, let upload = multer({ storage: storage, dest: 'documents/' }); вы должны удалить dest здесь, так как вы указали dest на хранение, правильно?

+0

И как вы перемещаете файл? Я попытался использовать переименование для этого, но для меня это вообще не работает. – Zeokav

+0

Ну, вот еще вопрос о написании файла другому в node.js. http://stackoverflow.com/questions/11293857/fastest-way-to-copy-file-in-node-js – YLS

0

отредактировал

См https://github.com/expressjs/multer#diskstorage

Note that req.body might not have been fully populated yet. It depends on the order that the client transmits fields and files to the server.

В связи с этим, первый файл записи в временный каталог, прочитайте имя каталога с REQ и переместить файл:

fs = require('fs-extra'); //npm install fs.extra 
... 

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
     cb(null, '../tempDir/') 
    }, 
    filename: function (req, file, cb) { 
     cb(null, file.originalname) 
    } 
}); 

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

upload(req, res, function (err) { 
    if (err) { 
     res.json({}); 
     return; 
    } 

    var dir = JSON.parse(req.body.data).directory; 
    var filename = req.file.filename; 

    fs.move('../tempDir/' + fileName, '../tempDir/' + dir + '/' + fileName, function (err) { 
     if (err) { 
      return console.error(err); 
     } 

     res.json({}); 
    }); 

});