Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 如何发送带有预定义boudary的multipart/mixed with CURL?_Http_Curl_Multipart - Fatal编程技术网

Http 如何发送带有预定义boudary的multipart/mixed with CURL?

Http 如何发送带有预定义boudary的multipart/mixed with CURL?,http,curl,multipart,Http,Curl,Multipart,我需要将文件发送到包含多部分/混合内容的服务器。例如: ------------------------------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

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

------------------------------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--
但服务器无法成功处理部件。目前我没有服务器的日志,但我执行tcpdump以查看发送到服务器的内容:

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

你知道如何用多部分/混合兼容格式发送我的文件吗

为hanshenrik编辑:


让curl自己完成多部分POST,让它自己完全处理分隔符。例如,如果您想发布两个部分,其中包含从两个不同文件读取的内容,请执行以下操作:

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


然后,您需要输入并使用-data二进制。

使用Flask框架,我在/addapi端点中接收数据

@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发送数据-在我的情况下是一个文本文件-二进制将是另一种情况。像这样

#/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_数据,它似乎对extra'和s非常挑剔

只需删除content-type头并让curl自动为您生成它。这应该行得通。事实上,我很惊讶curl解析出了您的自定义头并采用了边界。也下降-XPOST@hanshenrik请参见我的编辑,默认内容类型回退到application/x-www-form-urlencoded::它可以与-data binary一起工作,但是需要使用CURLS的-H选项传递一些头,因为实际上发送了两个请求。
#/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