2012-05-26 12 views

cevap

57

Çözülen: test.txt aşağıdaki metni içerir, ve en önemlisi olan

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

CRLF (\ r \ n) satır sonları:

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

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

Notlar: o -d yerine eski yerine --data-binary kullanmak önemli çünkü satır sonları (çok karınca). Ayrıca, vücuttaki sınırın fazladan bir -- ile başladığını unutmayın.

Tekrar edeceğim çünkü bu çok önemli, ancak bu istek-body dosyası CRLF satır sonlarına sahip olmalıdır. İyi bir satır sonu desteğine sahip çok platformlu bir metin editörü, jEdit'dir (how to set the line endings in jEdit).

Bunun için nasıl çalıştığımı (yalnızca Ruby on Rails uygulamasıyla hata ayıklama) ve yalnızca son çözümle ilgilenmiyorsanız, my blog numaralı hata ayıklama adımlarını yazdım.

+3

Aferin, efendim. Satır sonlarının CRLF olması gerektiğini söyleyen bana ulaşmak 4 saat sürdü. Çok teşekkürler. –

+0

Tim, rica ederim. Bu beni çağlar için şaşırttı. RFC, http://tools.ietf.org/html/rfc2046 (arama 'CRLF') anahtarına sahiptir. Daha da kötüsü, eğer '-d' kullanırsanız, kıvrım aslında satır sonlarını kıstırır! –

+0

Neden Unix'in aşkı için satır sonları CRLF olmalıdır ?! Bunu işaretlediğiniz için teşekkürler. –

11

Geçici dosyalara gerek olmadan, tek satır olarak -d kullanarak yeniden yazılmış orijinal CURL deyimiyle alternatif bir yanıt. Şahsen geçici dosyalar yaklaşımı anlamak daha kolay olduğunu düşünüyorum, ama ben de referans için buraya bu koyuyorum:

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 

Notlar: $'blar' sözdizimi böyledir CRLF olarak \ r \ n ayrıştırmak edeceğini bash jeton. Bu ipucu için this answer'a teşekkürler.

20

kullanarak bir resim dosyası yüklemek için bu bir açık

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

teşekkürler, ancak özellikle test için işlenmemiş verileri iletmek istiyorum, böylece anlayabiliyorum - ve daha sonra curl tabanlı olmayan bir programda kullanıyorum. –

+0

Teşekkür ederim, "type = ..." bana çok yardımcı oldu! – Hemeroc

0

ile --form argüman kullanabilirsiniz "Content-Type: multipart/ilgili" Bu içindir

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

çok parçalı/form-veri istek yöntemi. Bir dosya yükleme için --form dosya = ekle "@ yolu/image.jpg; tür = resim/JPEG"

kıvırmak --form anahtar = "değeri" --form anahtar = "değeri" http://localhost:3000/test

+0

Bu, "-F" ve "--form" aynı seçenek olduğundan, bu soruyu yanıtlamaz; manuel sayfada '-F, - form '. –

2

Kullanmakta olduğum şey, temiz olduğunu ve geçici dosyalara ihtiyaç duymadığını ve tüm dosyaları yüklemek istediğinizde RAM belleğini kaldırdığını (bu nedenle okuma dosyalarını hiç belleğe dökmemek) kullanıyorum.

# 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 @-)" 
İlgili konular