【问题标题】:Get image sent from post in node.js获取从 node.js 中的帖子发送的图像
【发布时间】:2016-06-15 18:50:06
【问题描述】:

我需要使用python通过post发送图片,然后下载到node.js服务器端。

Python 代码:

import requests
from PIL import Image
import json

url = 'http://127.0.0.1:8080/ay'
files = {'file': open('image.jpg', 'rb')}
r = requests.post(url, data = files)

Node.js 代码:

var app = express();
app.use(bodyparser.json({ limit: '50mb' }));
app.use(bodyparser.urlencoded({ limit: '50mb', extended: true }));

app.post('/ay', function(req, res) {
    var base64Data = req.body.file
    require("fs").writeFile("out.png", base64Data, 'base64', function(err) {
        console.log(err);
    });

    res.send('done');
});

但我似乎无法在服务器上正确下载文件,所以我想知道 python 使用什么格式打开图像以及如何修复 node.js 代码以便它可以正确下载图像。

编辑:代码存在一些问题,我现在正在尝试使用 multer,但似乎无法正常工作。

Python 代码:

import requests

url = 'http://127.0.0.1:8080/ay'
files = {'file': open('image.jpg', 'rb')}
r = requests.post(url, files = files)

Node.js 代码:

var express = require('express');
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })
var app = express();

app.post('/ay', upload.single('avatar'), function (req, res, next) {
    console.log(req.file)
    res.send("done");
});

app.post('/ay', upload.array('photos', 12), function (req, res, next) {
    console.log(req.files)
    res.send("done");
});

我已经尝试过 upload.single 和 upload.array ,但都不起作用。

【问题讨论】:

  • 你是否包含了中间件来处理 Node 中的 POST 数据?
  • 是的!我刚刚编辑了我的代码以显示它。我在服务器端接收图像,但我不知道它是如何编码的,所以我似乎无法解码它。
  • bodyParser 对文件不起作用,它在documentation 的顶部这么说。您需要 multer、busboy 或其他支持文件的工具之一。此外,文件必须使用正确的密钥以multipart/form 发送,而不是 JSON。
  • 我认为你的python应该是r = requests.post(url, files=files)

标签: javascript python node.js multer


【解决方案1】:

所以我终于用 multer 弄明白了……错误地命名密钥是我无法正确使用 multer 的原因。

Python:

import requests
url = 'http://127.0.0.1:8080/ay'
files = {'file': open('image.jpg', 'rb')}
r = requests.post(url, files = files)

Node.js:

var express = require('express');
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })
var app = express();

app.post('/ay', upload.array('file', 12), function (req, res, next) {
    console.log(req.files)
    res.send("done");
});

【讨论】:

    【解决方案2】:

    看看this blog post which gives an example regarding how to access an uploaded file in node.js

    在该示例中,加载 bodyParser 中间件后,您可以访问名为 req.files 的对象,其中包含有关您上传文件的信息。

    执行console.log(req.files) 并查看它显示的内容。

    在不再维护的 Express v3 中,bodyParser 中间件可用于读取上传的文件。

    如果你使用v4或更高版本,你可以使用connect-multiparty中间件,像这样:

    var multipart = require('connect-multiparty');
    var multipartMiddleware = multipart();
    app.post('/ay', multipartMiddleware, function(req, resp) {
      console.log(req.body, req.files);
      // don't forget to delete all req.files when done 
    });
    

    另外,我认为您的 Python 代码没有正确上传。尝试:

    requests.post('http://127.0.0.1:8080/ay', files={'image.jpg': open('image.jpg', 'rb')})
    

    【讨论】:

    • 所以我的 nodejs 版本已经在工作了......但这是 nodejs 的 python 这就是我遇到这个问题的原因。我发送到服务器的 json 只有 1 个键值对,即 file:some encoding。
    • 你怎么知道节点部分工作正常?您是否有一个将文件上传到该端点并且读取正确的 HTML 表单?
    • 是的,这就是我所拥有的。我确实测试了你的代码...... req.body - 我如何将它转换回图像?现在我在终端中看到字母数字字符和 %。
    • 实际上,我编辑了代码 - 现在我尝试使用 multer 而不是你的 multipart(因为该代码确实有效)但我无法让它工作。
    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 2013-07-27
    • 2014-08-10
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多