如何重写以下CURL命令,以便它不使用-F
选项,但仍会生成完全相同的HTTP请求?即,以便它直接传递体内的multipart / form-data。
curl -X POST -F example=test http://localhost:3000/test
答案 0 :(得分:59)
解决:
curl \
-X POST \
-H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" \
--data-binary @test.txt \
http://localhost:3000/test
test.txt
包含以下文字,最重要的是 CRLF(\ r \ n)行结尾:
------------------------------4ebf00fbcf09
Content-Disposition: form-data; name="example"
test
------------------------------4ebf00fbcf09--
注意:使用--data-binary
代替普通旧-d
非常重要,因为前者会保留行结尾(这非常重要)。另请注意,正文中的边界以额外--
开头。
我将重复它,因为它非常重要,但该请求体文件必须具有CRLF行结尾。具有良好行结束支持的多平台文本编辑器是jEdit(how to set the line endings in jEdit)。
如果您对我的工作方式感兴趣(使用Ruby on Rails应用程序进行调试)而不仅仅是最终解决方案,我会在my blog上编写调试步骤。
答案 1 :(得分:22)
您可以使用明确
的--form
参数
curl -H "Content-Type: multipart/related" \
--form "data=@example.jpg;type=image/jpeg" http://localhost:3000/test
答案 2 :(得分:15)
这是一个替代答案,原始CURL语句使用-d
作为单行重写,没有临时文件。我个人认为临时文件方法更容易理解,但我也把它放在这里作为参考:
curl -X POST -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" -d $'------------------------------4ebf00fbcf09\r\nContent-Disposition: form-data; name="example"\r\n\r\ntest\r\n------------------------------4ebf00fbcf09--\r\n' http://localhost:3000/test
注意:$'blar'
语法是这样的,bash会将\ r \ n解析为CRLF令牌。感谢this answer获得该提示。
答案 3 :(得分:2)
这就是我正在使用的,我认为它很干净,不需要临时文件,也不需要上传RAM,以防你想要上传整个文件(所以没有把文件读入内存)。
# Set these two.
file='path/to/yourfile.ext'
url='http://endpoint.example.com/foo/bar'
delim="-----MultipartDelimeter$$$RANDOM$RANDOM$RANDOM"
nl=$'\r\n'
mime="$(file -b --mime-type "$file")"
# This is the "body" of the request.
data() {
# Also make sure to set the fields you need.
printf %s "--$delim${nl}Content-Disposition: form-data; name=\"userfile\"${nl}Content-Type: $mime$nl$nl"
cat "$file"
printf %s "$nl--$delim--$nl"
}
# You can later grep this, or something.
response="$(data | curl -# "$url" -H "content-type: multipart/form-data; boundary=$delim" --data-binary @-)"
答案 4 :(得分:0)
这是使用“Content-Type:multipart / related”,
上传一个图像文件curl --trace trace.txt -X POST -H 'Content-Type: multipart/related; boundary=boundary_1234' --data-binary $'--boundary_1234\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{\r\n\t"title": "TestFile"\r\n}\r\n\r\n--boundary_1234\r\nContent-Type: image/jpeg\r\n\r\n' --data-binary '@Image0177.jpg' --data-binary $'\r\n--boundary_1234--\r\n' 'http://localhost:3000/google/upload/drive/v2/files?uploadType=multipart'
答案 5 :(得分:0)
这就是我要怎么做:
curl https://httpbin.org/post \
-H 'content-type: multipart/form-data; boundary=----FormBoundary123456789' \
--data-binary $'------FormBoundary123456789\r
Content-Disposition: form-data; name="example"\r
\r
test\r
------FormBoundary123456789--\r
'
或更复杂(应该可移植到大多数现代外壳中):
DELIM=----FormBoundary$RANDOM$RANDOM
curl https://httpbin.org/post \
-H "content-type: multipart/form-data; boundary=$DELIM" \
--data-binary --$DELIM$'\r
Content-Disposition: form-data; name="example"\r
\r
test\r
'--$DELIM--$'\r
'
答案 6 :(得分:-3)
这适用于multipart / form-data请求方法。用于上传文件add --form filename =" @ path / image.jpg; type = image / jpeg"
卷曲 - 形成键="值" - 形成键="值" http://localhost:3000/test