2012-05-26 22 views

Trả lời

57

quyết:

curl \ 
    -X POST \ 
    -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" \ 
    --data-binary @test.txt \ 
    http://localhost:3000/test 

đâu test.txt chứa các văn bản sau đây, và quan trọng nhất là có CRLF (\ r \ n) dòng kết thúc:

------------------------------4ebf00fbcf09 
Content-Disposition: form-data; name="example" 

test 
------------------------------4ebf00fbcf09-- 

Ghi chú: đó là quan trọng để sử dụng --data-binary thay vì đồng bằng cũ -d như trước đây bảo tồn các kết thúc dòng (rất được nhập khẩu kiến). Ngoài ra, lưu ý rằng ranh giới trong cơ thể bắt đầu với thêm --.

Tôi sẽ lặp lại nó vì nó rất quan trọng, nhưng tệp yêu cầu-body đó phải có dòng cuối CRLF. Trình soạn thảo văn bản đa nền tảng với hỗ trợ kết thúc dòng tốt là jEdit (how to set the line endings in jEdit).

Nếu bạn quan tâm đến cách tôi làm việc này (gỡ lỗi bằng ứng dụng Ruby on Rails) và không chỉ là giải pháp cuối cùng, tôi đã viết các bước gỡ lỗi của mình trên my blog.

+3

Thực hiện tốt, thưa bạn. Tôi mất 4 giờ liên tục để bạn nói cho tôi biết kết thúc của dòng cần phải là CRLF. Cám ơn rất nhiều. –

+0

Tim, bạn được chào đón. Điều này khiến tôi bối rối vì tuổi tác. RFC có khóa http://tools.ietf.org/html/rfc2046 (tìm kiếm 'CRLF'). Phần tồi tệ hơn là curl sẽ thực sự munge các kết thúc dòng nếu bạn sử dụng '-d'! –

+0

Tại sao tình yêu của Unix phải kết thúc dòng là CRLFs ?! Cảm ơn bạn đã chỉ ra điều này. –

11

Đây là câu trả lời thay thế với câu lệnh CURL gốc được viết lại bằng cách sử dụng -d làm lớp lót một, không có tệp tạm thời. Cá nhân tôi nghĩ rằng cách tiếp cận tập tin tạm thời là dễ hiểu, nhưng tôi đặt này ở đây để tham khảo cũng như:

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 

Ghi chú: cú pháp $'blar' là để bash sẽ phân tích các \ r \ n như một CRLF mã thông báo. Nhờ có this answer cho mẹo đó.

20

Bạn có thể sử dụng đối số --form với một cách rõ ràng

curl -H "Content-Type: multipart/related" \ 
    --form "[email protected];type=image/jpeg" http://localhost:3000/test 
+3

cảm ơn nhưng tôi đặc biệt muốn chuyển vào dữ liệu thô để thử nghiệm, để tôi có thể hiểu nó - và sau đó sử dụng nó trong chương trình không dựa trên curl. –

+0

Cảm ơn bạn, "type = ..." đã giúp tôi rất nhiều! – Hemeroc

0

Điều này là để upload một file image sử dụng "Content-Type: multipart/liên quan",

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

này là dành cho phương thức yêu cầu nhiều phần/biểu mẫu dữ liệu. để tải lên một tập tin thêm --form filename = "@ path/image.jpg; type = image/jpeg"

curl --form key = "giá trị" --form key = "giá trị" http://localhost:3000/test

+0

Điều này không trả lời câu hỏi, vì '-F' và' --form' là cùng một tùy chọn; trong trang hướng dẫn '-F, --form '. –

2

Đây là những gì tôi đang sử dụng, tôi nghĩ rằng nó sạch sẽ và không cần các tệp tạm thời và cũng không tăng RAM trong trường hợp bạn muốn tải lên toàn bộ tệp (do đó không có tệp đọc vào bộ nhớ).

# 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 @-)" 
Các vấn đề liên quan