【问题标题】:KrakenD: Trouble to upload file though gateway via POST request using Form-DataKrakenD:无法使用 Form-Data 通过 POST 请求通过网关上传文件
【发布时间】:2022-08-06 12:34:02
【问题描述】:

描述你想做什么

在我的一个应用程序中,我需要从我的 Angular 网站将文件上传到我的服务器。 基本上,为了做到这一点,我使用了 FormData 对象,该对象附加了一些信息,如文件名等。 为了发送文件本身,我将在 FormData 中附加一个 fs.readStream()。 然后我通过 axios 将它发布到我的服务器端点。

代码示例(使用表单数据的邮递员请求):

var axios = require(\'axios\');
var FormData = require(\'form-data\');
var fs = require(\'fs\');
var data = new FormData();

data.append(\'avatar\', fs.createReadStream(\'/home/file.mp3\'));
data.append(\'title\', \'test\');
data.append(\'description\', \'test\');
var config = {
  method: \'post\',
  url: \'localhost:8080/upload-file\',
  headers: { 
    ...data.getHeaders()
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

关于服务器,它是在 node.js 中开发的,我使用“multer”中间件来检索文件。

端点代码示例:

import {Response, Request} from \"express\";
public static async UploadFile(req: Request, res: Response): Promise<any> { }

没有 krakend 网关,它可以完美运行,然后我可以在我的端点中检索文件,以便:req.file 发送的其他信息如 \"title\"、\"description\" 在 req.body

使用 krakend,我得到了服务器端除文件之外的所有信息,在请求中,我只找到 req.body 而不是 req.file

所以我的问题是,为什么 krakend 没有将文件数据发送到后端,以及通过 POST 请求 FormData 向 krakend 发送文件的解决方案是什么?

你的配置文件krakend.json的内容:

{
  \"version\": 3,
  ...
  {
      \"endpoint\": \"/upload\",
      \"method\": \"POST\",
      \"output_encoding\": \"no-op\",
      \"backend\": [
        {
          \"method\": \"POST\",
          \"encoding\": \"no-op\", 
          \"url_pattern\": \"/upload-file\",
          \"host\": [
            \"http://containername:8080\"
          ]
        }
      ]
    }
}

我尝试使用不同的 \"no-op\" 注释,但没有任何效果,我的印象是 krakend 不会解释我的文件上传

使用的命令你是如何启动这个软件的?

I use docker-compose:

  krakend:
    container_name: \'Gateway\'
    image: devopsfaith/krakend
    volumes:
      - ./KrakenD/dev/:/etc/krakend
    ports:
      - \"8080:8080\"
      - \"1234:1234\"
      - \"8090:8090\"
    links:
      - some containers
      - ...
    restart: always
    network_mode: bridge

日志我没有特定的日志,只有我的后端返回 400 代码,因为它在请求中找不到文件信息。

    标签: krakend


    【解决方案1】:

    对于那些正在经历同样问题的人。请注意邮递员是我问题的原因,KrakenD 确实支持将正文作为多部分/表单数据发送,所以不要忘记根据需要让标题通过。

    问题是通过邮递员时,我无法解释,但文件被严重发送到 krakenD。使用 Insomnia 或简单的 Curl 进行测试。

    【讨论】:

      【解决方案2】:

      也许您必须在输入标题中包含“Content-Type”。

      "input_headers": [
              "Authorization",
              "Content-Type"
      ],
      

      Here 你可以找到更多关于它的信息。

      【讨论】:

        猜你喜欢
        • 2014-05-28
        • 2018-05-13
        • 2019-04-05
        • 2022-07-29
        • 2018-12-13
        • 1970-01-01
        • 2022-08-09
        • 1970-01-01
        • 2022-12-10
        相关资源
        最近更新 更多