繁体   English   中英

Node.js multer 无法存储文件和字符串数据

[英]Node.js multer unable to store files and string data

我正在使用 Node.js 和 multer 来存储文件,但无法保存它们。

在 React 方面,我使用 post 请求在 formdata 中发送数据,浏览器显示文件和数据,节点接收请求,在 req.files 中我也得到文件。

我尝试了 upload.any()、upload.array(),但没有显示 req.file 或 req.files 中的文件。 当我尝试 upload.single("filename") 时,控制台显示数据。

我检查了 req.files——它显示:

  name: '783px-Test-Logo.svg.png',
  data: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 03 0f 00 00 01 67 08 06 00 00 00 e0 e4 75 c8 00 00 11 22 33 41 4d 41 00 00 b1 8f 0b fc 61 05 00 ... 18403 more bytes>,
  size: 18453,
  encoding: '7bit',
  tempFilePath: '',
  truncated: false,
  mimetype: 'image/png',
  md5: '6a78913c131cfcd539813bd4b7c42459',
  mv: [Function: mv]
}

所以我从浏览器获取文件,但问题是它正在创建一个空的存储文件夹。

这些是我的多重配置:

const userTypes = require("../internal/users/consts/userTypes");
const middlewares = require("../api/middlewares");
const AssignmentsApi = require("../api/assignment");
const multer = require('multer');


let storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './storage')
    },
    filename: function (req, file, cb) {
        cb(null, file.originalname + '-' + Date.now())
    }
});

const upload = multer({ storage });

module.exports = app => {
    const assignmentRouter = express.Router();
    assignmentRouter.use(middlewares.AuthMiddleware);
    assignmentRouter
        .route("/uploadnew")
        .post(middlewares.UserRolesMiddleware(userTypes.teacher),  upload.any(), function(req, res, next) {
            if (req.file) {
                console.dir("req.file", req.file);
                console.log("uploadnew files", req.file.assignmentFile);
                return res.end("Thank you for the file");
            } else if (req.files) {
                console.dir("req.files", req.files);
                console.log("uploadnew files", req.files.assignmentFile);
                return res.end("Thank you for the files");
            }
            res.end("Missing file");
        }); 
}```

如我所见,您没有使用path.join(...)使用下面的代码片段(从第 6 行开始)。 只需替换为您的文件夹相对路径,然后覆盖您想要的内容。

const path = require('path');

multer({
    storage: multer.diskStorage({
        destination: function (req, file, cb) {
            // IMPORTANT: don't forget to use path.join(....)
            const filePath = path.join(__dirname, `./storage`);
            cb(null, filePath);
        },
        filename: (req, file, cb) => {
            const extension = file.mimetype.split('/')[1];
            const dateField = (new Date().getTime() / 1000 | 0);
            const randomField = Math.random().toString(36).substring(2);
            const fileName = `${dateField}-${randomField}.${extension}`;
            return fileName;
        },
    }),
    limits: {
        fileSize: 1024 * 1024 * 10 // MB
    },
    fileFilter: (req, file, cb) => {
        let isValid = (file.mimetype === 'image/jpeg' ||
                       file.mimetype === 'image/jpg' ||
                       file.mimetype === 'image/png');
        cb(null, isValid);
    },
});

确保你的 HTML 中有相同的“文件名”。例如,对于多张图片上传,你需要有这样的东西

<input type="file" name="filename" multiple>

中间件应该是这样的:

router.post('/upload-images', upload.array('filename', 10), (req, res) => { ... });

注意:为了查看上传的文件,不要忘记在此之前为其定义公共 URL(例如):

app.use('/storage', express.static(path.join(__dirname, 'storage')));

在文档中:

注意:当提供目标为 function 时,您负责创建目录。传递字符串时,multer 将确保为您创建目录。

您提供 function 作为目的地。 我建议你在调用回调之前检查文件夹是否存在于 function 中。 例子:

let storage = multer.diskStorage({
    destination: function (req, file, cb) {
        const dir = './storage';
        if (!fs.existsSync(dir)) {
           fs.mkdirSync(dir);
        }
        cb(null, dir);
    },
    filename: function (req, file, cb) {
        cb(null, file.originalname + '-' + Date.now())
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM