Cách đúng để POST nhiều dữ liệu / biểu mẫu dữ liệu bằng cách sử dụng curl là gì?


164

Tôi đã sử dụng cú pháp này để đăng một tập tin cùng với một số tham số:

curl -v -include --form "key1=value1" --form upload=localfilename URL

Các tập tin có kích thước khoảng 500K. Trước hết, tôi thấy độ dài nội dung là 254 ở phía truyền. Sau đó, độ dài nội dung của phản hồi của máy chủ là 0. Tôi sẽ sai ở đâu?

Dưới đây là dấu vết đầy đủ của lệnh.

* Couldn't find host xxx.xxx.xxx.xxx in the _netrc file; using defaults
* About to connect() to xxx.xxx.xxx.xxx port yyyy (#0)
*   Trying xxx.xxx.xxx.xxx...
* Adding handle: conn: 0x4b96a0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x4b96a0) send_pipe: 1, recv_pipe: 0
* Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) port yyyy (#0)
* POST /zzzzzz/UploadFile HTTP/1.1
* User-Agent: curl/7.32.0
* Host: xxx.xxx.xxx.xxx:yyyy
* Accept: */*
* Content-Length: 254
* Expect: 100-continue
* Content-Type: multipart/form-data; boundary=------------------------948a6137eef50079
*
* HTTP/1.1 100 Continue
* HTTP/1.1 100 Continue

* HTTP/1.1 200 OK
* HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
* Server: Apache-Coyote/1.1
* Server: Apache-Coyote/1.1
* Added cookie JSESSIONID="C1D7DD042E250211D9DEA82688876F88" for domain xxx.xxx.xxx.xxx, path /zzzzz/, expire 0
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/;
* HttpOnly
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/; HttpOnly
* Content-Type: text/html;charset=ISO-8859-1
Content-Type: text/html;charset=ISO-8859-1
* Content-Length: 0
* Content-Length: 0
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Connection #0 to host xxx.xxx.xxx.xxx left intact

Câu trả lời:


254

Cú pháp sau đây sửa nó cho bạn:

curl -v -F key1=value1 -F upload=@localfilename URL

Còn Windows & curl.exe thì sao?
Piotr

1
Còn nhiều file đính kèm thì sao?
hellboy

8
Nó hoạt động giống hệt nhau trên Windows và.it hỗ trợ nhiều "tệp đính kèm" / tệp: chỉ cần thêm các phiên bản -F!
Daniel Stenberg

Câu trả lời này có một ví dụ hay về việc tải lên nhiều tệp. stackoverflow.com/questions/11599957/...
bmoran

Những công việc này. trên curl chúng ta không cần thêm một cái gì đó như thế này:-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
Emily

19

để tải lên một tệp bằng cách sử dụng curl trong Windows Tôi thấy rằng đường dẫn yêu cầu thoát dấu ngoặc kép

ví dụ

curl -v -F 'upload=@\"C:/myfile.txt\"' URL

1
Câu trả lời này đã giúp tôi rất nhiều. Mặc dù trong trường hợp của tôi, tôi không nên trốn thoát ", đó là trong trường hợp của tôi trên Mac, tôi nên gửi nó như thế nào curl -X POST -F key1=value1 -F 'image=@"/Users/ivkremer/Downloads/file name.jpg"';
ivkremer

trong trường hợp của tôi - Tôi đã chuyển khoản thành công mà không có bất kỳ trích dẫn nào: curl -v -F file=@/Users/path/to/file/testq.jpg 192.168.0.101:8080/upload-image
chatlanin

Trong trường hợp của tôi trong Windows, tôi không thể sử dụng dấu ngoặc đơn và phải sử dụng dấu ngoặc kép như thế nàycurl -F "filename=@\"C:\temp\file.jpg\"" https://someurl.com
Beems

5

Đây là những gì làm việc cho tôi

curl -F file=@filename URL

1

Tôi đã có một thời gian khó khăn để gửi một yêu cầu HTTP PUT nhiều phần với curlmột phụ trợ Java. Tôi chỉ đơn giản là cố gắng

curl -X PUT URL \
   --header 'Content-Type: multipart/form-data; boundary=---------BOUNDARY' \
   --data-binary @file

và nội dung của tập tin là

-----------BOUNDARY
Content-Disposition: form-data; name="name1"
Content-Type: application/xml;version=1.0;charset=UTF-8

<xml>content</xml>
-----------BOUNDARY
Content-Disposition: form-data; name="name2"
Content-Type: text/plain

content
-----------BOUNDARY--

nhưng tôi luôn có một lỗi rằng ranh giới không chính xác. Sau một số gỡ lỗi phụ trợ Java, tôi phát hiện ra rằng việc triển khai Java đã thêm \r\n--tiền tố vào ranh giới, vì vậy sau khi thay đổi tệp đầu vào của tôi thành

                          <-- here's the CRLF
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY--     <-- added '--' at the beginning

mọi thứ đều hoạt động tốt!

tl; dr

Thêm một dòng mới (CRLF \r\n) ở đầu nội dung ranh giới nhiều phần và --ở đầu các ranh giới và thử lại.

Có thể bạn đang gửi yêu cầu đến phụ trợ Java cần thay đổi này trong ranh giới.


Khi sao chép dữ liệu POST bằng bảng điều khiển web Firefox, tôi cũng nhận thấy rằng nó đang sử dụng \nthay vì \r\n. Ngay cả bản sao mitmproxy như cURL đang sử dụng \nnên tôi đã phải sao chép yêu cầu thô với mitmproxy. Tôi thấy với hexdump rằng nó đang sử dụng mã hex 0Athay vì 0D 0A.
baptx

những \r\nlà bắt buộc. Nhìn vào tools.ietf.org/html/rfc2046#section-5.1.1 trang 19.
Adam Zahran

0

Trên Windows 10, curl 7.28.1 trong powershell, tôi đã tìm thấy những cách sau để làm việc với tôi:

$filePath = "c:\temp\dir with spaces\myfile.wav"
$curlPath = ("myfilename=@" + $filePath)
curl -v -F $curlPath URL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.