使用 Multer 和 Node.js 返回上传文件的文件名

6
我正在使用ionic 2创建一个简单应用程序,连接到运行multer的node服务器以上传图片作为学习经验。我遇到的问题是,我需要将multer返回的最终文件名传回上传它的应用程序,以便在本地保存它。我使用@ionic/cloud-angular中的Auth和User模块进行身份验证和用户信息。User对象具有一个details对象,其中包括“名称”,“电子邮件”,“用户名”,“图像”等内容。
因此,当图像上传到node服务器并由multer保存时,我需要将该文件名传回应用程序,以便我可以更新user.details.image属性。
以下是我的node服务器的简单版本...
var express = require('express');
var http = require('http');
var bodyParser = require('body-parser');
var multer = require('multer');
var cors = require('cors');
var postStorage = multer.diskStorage({
    destination: function(req, file, callback) {
        callback(null, './uploads');
    },
    filename: function(req, file, callback) {
        let fileName = '', postName;
        if(typeof req.body.postName !== "undefined") {
            postName = req.body.postName.toLowerCase().replace(/ /g, '-');
            filename += postName;
        }
        fileName += new Date().getTime();
        fileName += ".png";
        callback(null, fileName);
    }
});
var app = express();
app.set('port', process.env.PORT || 3000);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cors());
app.post('/upload', function(req, res) {
    var uploadPost = multer({storage: postStorage}).single('post_image');
    uploadPost(req, res, function(err) {
        if(err) {
            return res.end("error uploading file");
        }
        res.end("file uploaded");
    });
});
app.listen(app.get('port');
console.log("app listening on port: " _ app.get('port'));

有没有一种方法可以让Multer发送回保存的最终文件名?就像res.json({fileName: fileName}); res.end()这样。我目前真的不知道,所有我能找到的关于Multer的教程都只是展示如何创建新的文件名并将文件保存在磁盘、数据库或内存中,但它们并没有展示如何实际上将文件名传回上传它的应用程序。非常感谢您提供的任何帮助。如果需要查看上传内容的Ionic 2代码,请告诉我,我将更新帖子中的代码。谢谢。

这就是你在现实生活中编码的方式吗?每行之间没有换行符?哎呀... - borislemke
不,我试图压缩代码并简化它以便发布。如果我发布了200行可以用50行完成的代码,人们肯定会有点烦恼。我认为这对于帖子来说更好。 - Neglected Sanity
1个回答

6

如果您上传单个文件,可以使用req.file.filename获取文件名。

如果您上传多个文件,则可以使用req.files

一旦您获得了文件名,就可以使用res.send({filename:FileName})将其发送给客户端。


那部分不是问题,我已经能够毫无问题地上传文件了,但我无法弄清楚如何将新文件名返回给上传应用程序。由于我正在使用multer创建一个新的文件名,所以我需要告诉上传文件的应用程序新文件名是什么。 - Neglected Sanity
举个例子,假设我使用ajax... $.ajax({ url: "localhost:3000/upload", data: {post_image: [FILENAME]}, success: function(msg) { //这里需要新的文件名 } }); - Neglected Sanity
你需要的是 res.send({filename:name_of_your_file}); 吗? - Dinesh undefined
看起来完美地运行了,谢谢@Dinesh 最后一个问题,为什么当我发送一个文件和postName = test时,req.body会是{}且没有任何内容? - Neglected Sanity
因为您没有发送任何表单字段。如果您发送了表单字段,它们将在req.body中。如果您发送了文件,它将在req.file中。我已更新我的答案,请接受它如果有帮助。谢谢。 - Dinesh undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接