【问题标题】:Sending files back and forth with nodejs使用nodejs来回发送文件
【发布时间】:2020-04-17 10:50:24
【问题描述】:

我已经在多个地方询问并搜索过这个问题,但找不到任何答案。所以, 我有一个实现Rest 方法的快速服务器。我的客户可以发送和接收他们的数据,但我希望他们也能够发送文件,并且服务器应该按需将文件发送回客户端。从 JavaScript 我可以使用 formData 但我想知道或学习正确的方法。其中之一是 base64 字符串。谁能给我一个在 Rest 环境中来回发送文件的简单来回示例?还是带我去?谢谢

【问题讨论】:

  • 我建议您查找有关如何将文件上传到express 服务器以及如何从中下载文件的教程 - 那里有很多。如果您仍然遇到问题,请返回并向我们展示您的代码,以便我们更好地帮助您。
  • 关于如何发送REST请求,我说我们没有REST请求,REST只是一个接受get、post、put、del请求的设计。所以你可以在没有 RESTful 设计的情况下工作
  • 谢谢。我已经在使用这种方法了。真的很感谢你多走一英里来发布它。我目前发送文件 url 作为响应让前端处理它。这是可以接受的做法吗?
  • 问这个问题的主要原因是了解内容类型标题。比如我什么时候可以真正使用内容标题。
  • 有时在您的静态文件不需要保护和授权的情况下,这样做是可以的。(如烹饪课网站)但是当保护您的文件很重要时,您会知道如何去做吧。如果你只是尝试在特定的部分加深你的知识,你到了80岁,你就会知道如何做保护:)别担心。

标签: node.js json rest


【解决方案1】:

关于如何发送 REST 请求,我说我们没有 REST 请求,REST 只是一种接受 get、post、put、del 请求的设计。所以你可以在没有 RESTful 设计的情况下工作

您可以使用此package,该package 已针对上传文件进行了优化。

首先使用 multer 定义一个上传助手:

const multer = require('multer');
const mkdirp = require('mkdirp');
const fs = require('fs');

const getDirImage = () => {
    let year = new Date().getFullYear();
    let month = new Date().getMonth() + 1;
    let day = new Date().getDay();
    return `${config.homedir}/public_html/uploads/images/${year}/${month}/${day}`;
};
const ImageStorage = multer.diskStorage({
    destination: (req, file, cb) => {
        let dir;
        if (file.mimetype === 'text/css') {
            dir = getDirCss();
        } else {
            dir = getDirImage();
        }
        mkdirp(dir, (err) => cb(null, dir))
    },
    filename: (req, file, cb) => {
        let filePath;
        if (file.mimetype === 'text/css') {
            filePath = getDirCss() + '/' + file.originalname;
        } else {
            filePath = getDirImage() + '/' + file.originalname;
        }

        if (!fs.existsSync(filePath))
            cb(null, file.originalname);
        else
            cb(null, Date.now() + '-' + file.originalname);

    }
});
const uploadImage = multer({
    storage: ImageStorage,
    limits: {
        fileSize: 1024 * 1024 * 10
    }
});
module.exports = uploadImage;

在您的路线文件中:

const upload = require('path/to/upload/helper');
router.post('/imageUpload', upload.single('image'), imageValidator.handle(), imageController.update);

然后你可以在req.file访问你上传的文件

关于将 iamge 返回给用户,您可以在上传文件夹中返回其 url,以便他们获取;但为此,您需要提供静态文件:

app.use(express.static('your_upload_dir'));

现在您可以在以下位置访问静态文件:

your_url/file's_location

或:localhost:your_app_port/file's location

如果你在 localhost 上进行测试

如果您想限制对这些文件的访问,您可以使用中间件来检查用户的令牌或 IP 或其他内容。困难的部分是创建一个模型来存储文件名和 url 以及一个通过文件名请求文件的路径。

【讨论】:

  • 我使用multer。我在考虑如何将文件作为休息请求发送到我的服务器,反之亦然。
  • 我还有一个问题。所以,在这种方法中,我仍然必须使用 FormData。有什么方法可以在没有 formData 的情况下发布文件?
  • 我不知道如何在cmets中传递链接,请在google中搜索短语express how to send file without form data并尝试。
  • 这是我尝试的第一件事。发现没什么好说的:(
  • 那么对不起,我也是新手。 4个月学会express js
猜你喜欢
  • 2016-11-05
  • 2013-01-31
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多