【问题标题】:Curl how to POST multipart/form-data data and How to Read multipart/form-data in flask request卷曲如何发布多部分/表单数据数据以及如何在烧瓶请求中读取多部分/表单数据
【发布时间】:2023-04-03 07:00:01
【问题描述】:

我尝试通过包含以下内容的 CURL 发布 multipart/form-data,

  • 一个 JSON 对象
  • 流对象 pdf 和 jpeg 文件
  curl -i -X POST -H  
"Authorization":"eyJhbGciOiJIUzI1NiIsImV4cCI6MTQyNjcwNTY4NiwiaWF0IjoxNDI2NzAyMDg2fQ.eyJpZCI6MTc3fQ.yBwLFez2RnxTojLniL8YLItWVvBb90HF_yfhcsyg3lY" -H    

"Content-Type:application/multipart/form-data" -d '{"user data":  {"preferred_city":"Newyork","within_radious":"5"}}' --data-binary   

"uploaded_documents":@mydocument.pdf http://127.0.0.1:5000/api/city

现在,我需要在烧瓶请求对象中读取这个多部分数据。我试过了

request.data

它确实打印了数据,但我不确定如何读取流对象并将文件存储到磁盘。

【问题讨论】:

  • 你可以试试request.form
  • request.form 字典长度为零,表单中没有数据
  • 这是在 request.data ---- str: {"userdata":{"preferred_city":"Newyork","within_radious":"5"}}&uploaded_documents:@mydocument.pdf

标签: python curl flask multipartform-data


【解决方案1】:

您的 curl 命令存在一些问题,所有这些都可能导致问题:

  1. application/multipart/form-data 不是有效的 MIME 类型,因此 Content-Type 无效。对于文件上传,内容类型通常是multipart/form-data。此外,您不需要指定内容类型,curl 会根据参数计算出来。
  2. 使用-F 而不是-d 将导致 curl 生成并发布 multipart/form-data 具有有效边界的表单。
  3. 应为每个表单域指定一个名称。

把它们放在一起会产生这个 curl 命令:

curl -i -H "Authorization":"eyJhbGciOiJIUzI1NiIsImV4cCI6MTQyNjcwNTY4NiwiaWF0IjoxNDI2NzAyMDg2fQ.eyJpZCI6MTc3fQ.yBwLFez2RnxTojLniL8YLItWVvBb90HF_yfhcsyg3lY" \
    -F user_data='{"user data": {"preferred_city":"Newyork","within_radious":"5"}}' \
    -F uploaded_documents=@mydocument.pdf \
    http://127.0.0.1:5000/api/city

如果您不喜欢 curl 选择的部分,您可以为每个部分指定内容类型(文件将是 application/octet-stream):

curl -i -H "Authorization":"eyJhbGciOiJIUzI1NiIsImV4cCI6MTQyNjcwNTY4NiwiaWF0IjoxNDI2NzAyMDg2fQ.eyJpZCI6MTc3fQ.yBwLFez2RnxTojLniL8YLItWVvBb90HF_yfhcsyg3lY" \
    -F 'user_data={"user data": {"preferred_city":"Newyork","within_radious":"5"}};type=application/json' \
    -F 'uploaded_documents=@mydocument.pdf;type=application/pdf' \
    http://127.0.0.1:5000/api/city

最后一个命令会生成一个这样的 HTTP 请求:

POST /api/city HTTP/1.1 用户代理:curl/7.32.0 主机:127.0.0.1:5000 接受: */* 授权:eyJhbGciOiJIUzI1NiIsImV4cCI6MTQyNjcwNTY4NiwiaWF0IjoxNDI2NzAyMDg2fQ.eyJpZCI6MTc3fQ.yBwLFez2RnxTojLniL8YLItWVvBb90HF_yfhcsyg3lY 内容长度:496 期望:100-继续 内容类型:multipart/form-data;边界=------------1ab997efff76fe66 --------------------------1ab997efff76fe66 内容处置:表单数据;名称="用户数据" 内容类型:应用程序/json {“用户数据”:{“preferred_city”:“纽约”,“within_radious”:“5”}} --------------------------1ab997efff76fe66 内容处置:表单数据; name="uploaded_documents";文件名="我的文档.pdf" 内容类型:应用程序/pdf 这是 mydocument.pdf 文件。 它应该是一个 pdf 文件,但这更容易测试。 --------------------------1ab997efff76fe66--

然后在 Flask 中,您可以使用 request.form 访问表单数据,例如request.form['user_data']。由于它是一个 json 字符串,您可以使用 json.loads(request.form['user_data']) 加载它。

可以使用 request.file 访问上传的文件,如 Flask 文档中的 herehere 所述。

【讨论】:

  • 感谢 mhawke.. 它甚至可以使用 application/octet-stream 的多个文件工作得很好
猜你喜欢
  • 2017-03-17
  • 2016-11-11
  • 2015-10-31
  • 2019-10-13
  • 2019-03-02
  • 2020-01-18
  • 1970-01-01
  • 2016-02-12
相关资源
最近更新 更多