2017-01-02 147 views
0

我正在编写一个节点应用程序,并且正在寻找要在服务器上上传文件的内容。当只有一个静态目录时,我可以上传文件。但我需要为每个用户创建目录,然后根据登录的用户将文件上传到这些目录。我查看了一些内容,但是我尝试的所有内容都以错误结尾:ENOENT:没有这样的文件或目录,打开...错误。我试图目前做的就是这一点 -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而是因为我想从请求对象的目录名称不为我工作的方式。

当我在multer初始化中删除存储属性时,文件以随机名称存储在文档目录中。我希望文件有它的原始名称,我希望它被存储在一个目录中,我从req对象中获得目录的名称。
帮兄弟出来,谢谢!在公共目录

1.Store文件第一,喜欢的/ tmp /:

+0

见编辑答案(这对我行得通)。 –

回答

0

在项目中,我使用multer如下。

2.复制/移动文件到你想要的任何地方,到我的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({}); 
    }); 

});