【问题标题】:How to send multipart/mixed with CURL with predifined boudary?如何发送带有预定义边界的多部分/混合 CURL?
【发布时间】:2018-07-23 14:28:50
【问题描述】:

我需要将文件发送到包含多部分/混合内容的服务器。例如:

------------------------------1b479dca9c3e
Content-Disposition: form-data; name="one_part"
Content-Type: text/xml; charset=utf-8
XX-Project-Type: METADATA

<?xml version="1.0" encoding="utf-8"?>
<My_MSG version="1">
  <MSG date="2014-08-20T18:39:59.154326+00:00">
    <METADATA mess_id="sd1212sd05AZ">
      <CONVERSION>
        <FILE name="foo.bar"/>
        <FILE name="ping.pong"/>
        <FILE name="abc.def"/>
      </CONVERSION>
    </METADATA>
  </MSG>
</My_MSG>

------------------------------1b479dca9c3e
Content-Disposition: form-data; name="one_part"
Content-Type: text/xml; charset=utf-8
XX-Project-Type: METADATA

<?xml version="1.0" encoding="utf-8"?>
<My_MSG version="1">
  <MSG date="2015-08-20T19:39:59.154326+00:00">
    <METADATA mess_id="az987456321">
      <CONVERSION>
        <FILE name="bar.foo"/>
        <FILE name="pong.ping"/>
        <FILE name="def.abc"/>
      </CONVERSION>
    </METADATA>
  </MSG>
</My_MSG>

------------------------------1b479dca9c3e--

如您所见,多部分边界已定义到要发送的文件中,因此要使用 CURL 发送它,我使用以下命令:

curl -d @/tmp/exemple.file -XPOST http://myServer:8000/multipartService -H "content-type: multipart/Mixed ; boundary=----------------------------1b479dca9c3e"

但是服务器没有成功处理部分。目前我没有服务器的日志,但我执行 tcpdump 以查看发送到服务器的内容:

似乎在发送请求中删除了空格和回车,这可以解释请求内容不能被服务器作为多部分/混合处理......

您知道如何发送符合多部分/混合格式的文件吗?


为 hanshenrik 编辑:

【问题讨论】:

  • 只需删除内容类型标题并让 curl 自动为您生成它。那应该工作。我真的很惊讶 curl 解析了您的自定义标题并采用了边界。也删除 -XPOST
  • @hanshenrik 查看我的编辑,默认内容类型回退到 application/x-www-form-urlencoded :/

标签: http curl multipart


【解决方案1】:

让 curl 自己执行多部分 POST 并让它完全自己处理分隔符。例如,如果您想发布两个部分,其内容从两个不同的文件中读取,请这样做:

curl -F "part_one=<file1.xml" -F "part_two=<file2.xml" \
http://myServer:8000/multipartService

坚持?

那么你需要do the whole thing yourself使用--data-binary

【讨论】:

  • 它适用于--data-binary,但需要使用 CURLS 的 -H 选项传递一些标头,因为实际上发送了两个请求。
【解决方案2】:

使用 Flask 框架,我在 /add API 端点接收数据。

@app.route('/add', methods=['POST'])
def add():
    if request.headers['Content-Type'].startswith('multipart/form-data'):
        print("multi-form data")
        json_data=request.form.get("json_data")
        jd = json.loads(json_data)
        file_data=request.form.get("file")
        return "200 Ok" 

我使用 CURL 发送数据 - 在我的情况下是 TEXT 文件 - 二进制将是不同的情况。像这样

#/bin/bash
# Note 2 variables file and json
# file is loaded using < redirection
# Json_Data is a hand crafted dictionary
curl -X POST -H "Content-Type: multipart/form-data" \
     -F "file=<MixedContent.sh" \
     -F "json_data={\"username\":\"xyz\",\"password\":\"xyz\"}" \
     -X POST http://127.0.0.1:5000/add

注意 -F "json_data" 额外的 ' 和 "s" 似乎很挑剔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多