curl을 사용하여 multipart / form-data를 POST하는 올바른 방법은 무엇입니까?


164

이 구문을 사용하여 파일을 일부 매개 변수와 함께 게시했습니다.

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

파일 크기는 약 500K입니다. 우선, 전송 측에서 내용 길이는 254입니다. 나중에 서버 응답의 내용 길이는 0입니다. 어디에서 잘못 되었습니까?

다음은 명령의 완전한 추적입니다.

* 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

답변:


254

다음 구문이이를 해결합니다.

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

Windows & curl.exe는 무엇입니까?
Piotr

1
여러 첨부 파일은 어떻습니까?
hellboy

8
Windows에서 정확히 동일하게 작동하며 여러 "첨부 파일"/ 파일을 지원합니다. -F 인스턴스를 더 추가하십시오!
Daniel Stenberg

이 답변에는 여러 파일을 업로드하는 좋은 예가 있습니다. stackoverflow.com/questions/11599957/…
bmoran

작동합니다. curl에서 우리는 다음과 같은 것을 추가 할 필요가 없습니다 :-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
Emily

19

Windows에서 curl을 사용하여 파일을 업로드하려면 경로에 이스케이프 된 큰 따옴표가 필요하다는 것을 알았습니다.

예 :

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

1
이 답변은 많은 도움이되었습니다. 내 경우에는 탈출하지 말아야하지만 "Mac에서는 내 경우처럼 보내야한다 curl -X POST -F key1=value1 -F 'image=@"/Users/ivkremer/Downloads/file name.jpg"'.
ivkremer

내 경우에-나는 따옴표없이 성공 전송을했다 : curl -v -F file=@/Users/path/to/file/testq.jpg 192.168.0.101:8080/upload-image
chatlanin

Windows의 경우에는 작은 따옴표를 사용할 수 없었으며 다음과 같이 큰 따옴표를 사용해야했습니다curl -F "filename=@\"C:\temp\file.jpg\"" https://someurl.com
Beems

5

이것이 나를 위해 일한 것입니다

curl -F file=@filename URL

1

다중 부분 HTTP PUT 요청을 curlJava 백엔드로 보내는 데 어려움을 겪었습니다 . 나는 단순히 시도했다

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

파일 내용은

-----------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--

그러나 항상 경계가 잘못되었다는 오류가 발생했습니다. 일부 Java 백엔드 디버깅 후 Java 구현이 \r\n--접두사로 접두사를 추가하고 있음을 알았습니다 . 따라서 입력 파일을

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

모든 것이 잘 작동합니다!

tl; dr

\r\n멀티 파트 경계 컨텐츠 --의 시작 과 경계의 시작에 개행 (CRLF )을 추가하고 다시 시도하십시오.

어쩌면 경계에서 이러한 변경이 필요한 Java 백엔드로 요청을 보내고있을 수 있습니다.


Firefox 웹 콘솔을 사용하여 POST 데이터를 복사 할 때 . \n대신 사용 중임을 알았습니다 \r\n. cURL이 사용하는 mitmproxy 사본조차도 \n원시 요청을 mitmproxy로 복사해야했습니다. 16 진수 덤프 0A대신 16 진수 코드 를 사용하고 있음을 보았습니다 0D 0A.
baptx

\r\n필요합니다. 봐 tools.ietf.org/html/rfc2046#section-5.1.1 19 페이지
아담 자흐

0

Windows 10의 powershell에서 curl 7.28.1을 사용하면 다음과 같은 결과가 나타납니다.

$filePath = "c:\temp\dir with spaces\myfile.wav"
$curlPath = ("myfilename=@" + $filePath)
curl -v -F $curlPath URL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.