使用python请求的多部分数据POST:未找到多部分边界

jee*_*era 27 python multipartform-data python-requests

我有一个表单数据以及要在同一个POST中发送的文件.例如,{duration:2000,file:test.wav}.我在使用python请求的multipart/form-data发布中看到了很多线程.它们很有用,特别是这个.

我的样例请求如下:

    files = {'file': ('wavfile', open(filename, 'rb'))}
    data = {'duration': duration}
    headers = {'content-type': 'multipart/form-data'}
    r = self.session.post(url, files=files, data=data, headers=headers)
Run Code Online (Sandbox Code Playgroud)

但是当我执行上面的代码时,我收到此错误:

5:59:55.338 Dbg 09900 [DEBUG]解析来自handler [null]的异常:org.springframework.web.multipart.MultipartException:无法解析multipart servlet请求; 嵌套异常是org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界.

所以我的问题是:1)如何查看发送请求的内容?无法使用wireshark,它不在网络上.2)为什么编码数据中缺少边界?我错过了什么,请指出.

Ian*_*sco 47

你永远不应该自己设置标题.我们使用边界正确设置标题.如果你设置了那个标题,我们就不会和你的服务器不知道期望的边界(因为它被添加到标题中).删除您的自定义Content-Type标题,你会没事的.

  • 抱歉,但这不是我的经验。如果我使用curl,并且不设置Content-Type,它会生成Content-Type:multipart/form-data的Content-Type。当我尝试使用 Python 请求进行相同操作时,它会生成 Content-Type: application/x-www-form-urlencoded ,这是错误的(并且被我正在运行请求的服务器拒绝。 (3认同)
  • 这个答案中的“我们”是谁? (3认同)
  • 您好,当我使用邮递员生成代码时,它显式添加该标头,但如果我尝试不使用标头,它就不起作用。也许你能发现我的错误/误解?/sf/ask/3579931701/ (2认同)
  • 我们指的是 requests 库的维护者。按照它的编写方式,它需要控制这个标头。自己指定它被记录为应该避免的行为 (2认同)

小智 6

使用显式"multipart/form-data"取出Content-Type标头有效!