使用Express和Node.js将文件上传到PostgreSQL的最简单方法

hmtdttj4  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(130)

我正在构建一个新闻门户应用程序,这种应用程序需要在其故事中上传文件。我使用PostgreSQL作为数据库来存储来自门户的所有信息。
我想知道如何将通过快递收到的文件上传到我的PostgreSQL数据库中,我在互联网上搜索了很多,没有找到任何非常简单的东西。
那么,我如何才能以一种简单有效的方式做到这一点,以一种稍后可以在URL中提供此文件的方式?
这是我的包。json:

{
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "nodemon",
    "production": "pm2 start index.js --name knowledge-backend"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bcrypt-nodejs": "0.0.3",
    "body-parser": "1.18.3",
    "busboy": "^1.6.0",
    "consign": "0.1.6",
    "cors": "2.8.4",
    "express": "4.16.3",
    "jwt-simple": "0.5.1",
    "knex": "0.21.1",
    "moment": "2.22.2",
    "mongoose": "^7.1.2",
    "multer": "^1.4.5-lts.1",
    "node-schedule": "1.3.0",
    "passport": "0.4.0",
    "passport-jwt": "4.0.0",
    "pg": "8.0.3",
    "pm2": "3.0.4"
  },
  "devDependencies": {
    "nodemon": "1.18.4"
  }
}

这是我尝试过的:

const busboy = require('busboy')

module.exports = app => {
    const save = (req, res) => {
        try {
            let bb = busboy({
                headers: req.headers,
                defCharset: "utf8"
            });
            let fields = {};
            bb.on("field", (fieldname, val, fieldnameTruncated, valTruncated) => {
                console.log(fieldname, val);
                fields[fieldname] = val;
            });
            bb.on("file", (fieldname, fileStream, filename, encoding, mimetype) => {
                console.log('File captured')
            });
            res.status(200).send()
        } catch (err) {
            console.log("file upload catch", err);
        }
    }
}

routes.js:

module.exports = app => {
    app.route('/files')
        .post(app.api.file.save)
}
zyfwsgd6

zyfwsgd61#

看看这个文件,它有三个功能,一个保存,一个通过id获取文件,一个通过id删除文件:

const busboy = require('busboy')
const path = require('path');
const os = require('os');
const fs = require('fs');

module.exports = app => {
    const save = (req, res) => {
        const bb = busboy({ headers: req.headers });
        bb.on('file', function (fieldname, file, filename) {
            const saveTo = path.join(os.tmpdir(), String(filename.filename));
            file.pipe(fs.createWriteStream(saveTo)).on('close', function () {
                fs.readFile(saveTo, function (err, data) {
                    if (err) throw err;
                    app.db('files').insert({ name: filename, data: data })
                        .returning('id')
                        .then(id => {
                            console.log('https://localhost:3000/files/' + id);
                            fs.unlink(saveTo, function(err) {
                                if (err) throw err;
                                console.log('Arquivo removido com sucesso!');
                            });
                        }).catch((err) => {
                            console.error(err);
                        });
                });
            });
        });
        bb.on('finish', function () {
            console.log('Upload complete');
            res.status(200).send("That's all folks!");
        });
        return req.pipe(bb);
    };

    const getById = (req, res) => {
        const id = req.params.id;

        app.db('files')
            .select('data')
            .where({ id })
            .first()
            .then((result) => {
                const fileData = result.data;
                res.contentType('application/octet-stream');
                res.send(fileData);
            })
            .catch(err => res.status(500).send(err))
    }

    const remove = (req, res) => {
        const id = req.params.id;

        app.db('files')
            .where({ id })
            .first().del()
            .then(_ => res.status(204).send())
            .catch(err => res.status(500).send(err))
    }

    return { save, getById, remove }
}

此文件是一个Node.js模块,包含使用Express将文件上传到PostgreSQL的函数。它定义了三个功能:保存、getById和remove,它们被导出用于代码的其他部分,您可以将这些函数直接链接到路由中:

module.exports = app => {
    app.route('/files')
        .post(app.api.file.save)

    app.route('/files/:id')
        .get(app.api.file.getById)
        .delete(app.api.file.remove)
}

保存函数是使用busboy库(因为它已经被使用)来解析HTTP请求并从文件中提取数据,然后使用Node.js的fs模块将文件临时保存在操作系统上,使用path和os模块获得文件的临时路径,从文件系统读取文件的内容,然后使用knex.js的insert函数将其插入PostgreSQL数据库。在插入到数据库中之后,使用fs模块的unlink函数删除临时文件。
getById函数负责通过文件ID从数据库中获取文件,但如果愿意,也可以将其修改为通过文件名获取文件。它将ID作为请求URL中的参数,并执行数据库查询以检索文件的内容。内容作为请求响应返回,其中Content-Type报头设置为application/octet-stream,指示内容是字节流。
remove函数负责根据文件ID从数据库中删除文件。它将ID作为请求URL中的参数,并对数据库执行删除操作。

相关问题