卷曲如何 POST multipart/form-data 数据以及如何读取烧瓶请求中的 multipart/form-data
Curl how to POST multipart/form-data data and How to Read multipart/form-data in flask request
我尝试通过包含
的 CURL 发布 multipart/form-data
- A JSON Object
- Stream object pdf and jpeg file
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
现在,我需要在 Flask 请求中读取这个多部分数据 object.i 已尝试
request.data
它确实打印了数据,但我不确定如何读取流对象并将文件存储到磁盘。
您的 curl 命令存在一些问题,所有这些问题都可能导致问题:
application/multipart/form-data
不是有效的 MIME 类型,因此
Content-Type
无效。对于文件上传,内容类型通常是 multipart/form-data
。另外,您不需要指定内容类型,curl 会根据参数计算出来。
- 使用
-F
而不是 -d
将导致生成卷曲并且 post
multipart/form-data
具有有效边界的表单。
- 应为每个表单域指定一个名称。
将它们放在一起得到这个 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
User-Agent: curl/7.32.0
Host: 127.0.0.1:5000
Accept: */*
Authorization:eyJhbGciOiJIUzI1NiIsImV4cCI6MTQyNjcwNTY4NiwiaWF0IjoxNDI2NzAyMDg2fQ.eyJpZCI6MTc3fQ.yBwLFez2RnxTojLniL8YLItWVvBb90HF_yfhcsyg3lY
Content-Length: 496
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------1ab997efff76fe66
--------------------------1ab997efff76fe66
Content-Disposition: form-data; name="user_data"
Content-Type: application/json
{"user data": {"preferred_city":"Newyork","within_radious":"5"}}
--------------------------1ab997efff76fe66
Content-Disposition: form-data; name="uploaded_documents"; filename="mydocument.pdf"
Content-Type: application/pdf
this is the mydocument.pdf file.
it should be a pdf file, but this is easier to test with.
--------------------------1ab997efff76fe66--
然后在 Flask 中,您可以使用 request.form
访问表单数据,例如request.form['user_data']
。由于它是 json 字符串,您可以使用 json.loads(request.form['user_data'])
.
加载它
我尝试通过包含
的 CURL 发布 multipart/form-data
- A JSON Object
- Stream object pdf and jpeg file
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
现在,我需要在 Flask 请求中读取这个多部分数据 object.i 已尝试
request.data
它确实打印了数据,但我不确定如何读取流对象并将文件存储到磁盘。
您的 curl 命令存在一些问题,所有这些问题都可能导致问题:
application/multipart/form-data
不是有效的 MIME 类型,因此Content-Type
无效。对于文件上传,内容类型通常是multipart/form-data
。另外,您不需要指定内容类型,curl 会根据参数计算出来。- 使用
-F
而不是-d
将导致生成卷曲并且 postmultipart/form-data
具有有效边界的表单。 - 应为每个表单域指定一个名称。
将它们放在一起得到这个 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 User-Agent: curl/7.32.0 Host: 127.0.0.1:5000 Accept: */* Authorization:eyJhbGciOiJIUzI1NiIsImV4cCI6MTQyNjcwNTY4NiwiaWF0IjoxNDI2NzAyMDg2fQ.eyJpZCI6MTc3fQ.yBwLFez2RnxTojLniL8YLItWVvBb90HF_yfhcsyg3lY Content-Length: 496 Expect: 100-continue Content-Type: multipart/form-data; boundary=------------------------1ab997efff76fe66 --------------------------1ab997efff76fe66 Content-Disposition: form-data; name="user_data" Content-Type: application/json {"user data": {"preferred_city":"Newyork","within_radious":"5"}} --------------------------1ab997efff76fe66 Content-Disposition: form-data; name="uploaded_documents"; filename="mydocument.pdf" Content-Type: application/pdf this is the mydocument.pdf file. it should be a pdf file, but this is easier to test with. --------------------------1ab997efff76fe66--
然后在 Flask 中,您可以使用 request.form
访问表单数据,例如request.form['user_data']
。由于它是 json 字符串,您可以使用 json.loads(request.form['user_data'])
.