Çok parçalı / form verilerindeki sınır nedir?


403

Hakkında bir soru sormak istiyorum multipart/form-data. HTTP başlığında Content-Type: multipart/form-data; boundary=???,.

Is ???serbest kullanıcı tarafından tanımlanacak? Yoksa HTML'den mi oluşturuldu? Benim tanımlamam mümkün mü ??? = abcdefg?



Yanıtlar:


424

Is ???serbest kullanıcı tarafından tanımlanacak?

Evet.

veya HTML tarafından mı sağlanıyor?

Hayır. HTML'nin bununla hiçbir ilgisi yoktur. Alttarafı oku.

???Olarak tanımlamam mümkün mü abcdefg?

Evet.

Web sunucusuna aşağıdaki verileri göndermek istiyorsanız:

name = John
age = 12

kullanmak application/x-www-form-urlencodedşöyle olurdu:

name=John&age=12

Gördüğünüz gibi, sunucu parametrelerin bir ve işareti ile ayrıldığını biliyor &. Eğer &bir parametre değeri gerekli o zaman kodlanmalıdır.

Peki sunucu kullanarak bir HTTP isteği aldığında bir parametre değerinin nerede başladığını ve bittiğini nasıl bilebilir multipart/form-data?

Sınırı kullanma , benzer &.

Örneğin:

--XXX
Content-Disposition: form-data; name="name"

John
--XXX
Content-Disposition: form-data; name="age"

12
--XXX--

Bu durumda sınır değeri XXX. Content-TypeSunucuyu aldığı verilerin nasıl bölüneceğini bilmesi için üstbilgide belirtirsiniz .

Yani yapmanız gerekenler:

  • Sunucuya gönderilen HTTP verilerinde görünmeyecek bir değer kullanın.

  • Tutarlı olun ve istek iletisinde her yerde aynı değeri kullanın.


54
Sınır sonuna fazladan "-" eklemelisiniz.
Sebastian Piskorski

13
Belgede okuyabilirsiniz. Sınır sonunun fazladan iki hiper olması gerekiyor "-" Bağlantı: w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Sebastian Piskorski

6
Mükemmel cevap. Sınır, çok parçalı yükün birden çok "parçasını" ayırmak için kullanılan "anahtar" dır. Normalde değişkenleri ayırmak için '&' gibi bir şey yeterlidir, ancak faydalı yükler içindeki faydalı yükleri ayırmak için daha benzersiz bir şeye ihtiyacınız vardır.
user2483724

1
@ K3rnel31 Elbette, yeni sınır dizgisi aynı uzunlukta değilse.
Oscar Mederos

5
İçerik Tipi başlığında bildirilen sınır değerinin aslında -XXX --- olacağını düşünüyorum çünkü parçaları ayırırken fazladan bir "-" yazılmalıdır (dolayısıyla --- XXX ---)
Theodore K .

96

Sorunun kesin cevabı şudur: evet,boundary 70 baytı uzunluğunu geçmediği ve sadece 7 bitlikUS-ASCII (yazdırılabilir) karakterlerden oluştuğu için parametre için rastgele bir değer kullanabilirsiniz .

multipart/*İçerik türlerinden birini kullanıyorsanız , aslında üstbilgideki parametreyi belirtmeniz gerekir , aksi takdirde sunucu (bir HTTP isteği olması durumunda) yükü ayrıştıramaz.boundaryContent-Type

Muhtemelen de ayarlamak istediğiniz charsetparametreyi UTF-8sizin de Content-Typeolabildiğini sürece başlığında kesinlikle emin yalnızca o US-ASCIIcharset yük verisi kullanılacaktır.

RFC2046'dan birkaç alakalı alıntı :

  • 4.1.2. Karakter Seti Parametresi:

    Diğer bazı parametre değerlerinin aksine, charset parametresinin değerleri büyük / küçük harfe duyarlı DEĞİLDİR. Bir charset parametresi olmadığında varsayılması gereken varsayılan karakter kümesi US-ASCII'dir.

  • 5.1. Çok Parçalı Medya Türü

    İçerik Aktarımı Kodlaması alanının [RFC 2045] tanımında belirtildiği gibi, "çok parçalı" türündeki varlıklar için "7 bit", "8 bit" veya "ikili" dışında kodlamaya izin verilmez. "Çok parçalı" sınır sınırlayıcıları ve başlık alanları her durumda her zaman 7bit US-ASCII olarak temsil edilir (başlık alanları RFC 2047'ye göre US-ASCII olmayan başlık metnini kodlayabilir) ve gövde bölümlerindeki veriler bir Kısmen parça bazında, her uygun gövde parçası için Content-Transfer-Encoding alanlarıyla.

    Çok parçalı varlıklar için İçerik Türü alanı bir parametre "sınır" gerektirir. Sınır sınırlayıcı satırı daha sonra tamamen iki tire karakteri ("-", ondalık değer 45) ve ardından İçerik Türü başlık alanından sınır parametre değerini, isteğe bağlı doğrusal boşluk ve sonlandırıcı CRLF içeren bir satır olarak tanımlanır.

    Sınır sınırlayıcılar kapsüllenmiş materyalin içinde görünmemeli ve önde gelen iki tireni saymamak için 70 karakterden uzun olmamalıdır.

    Son gövde parçasını takip eden sınır sınırlayıcı çizgisi, başka hiçbir vücut parçasının takip etmeyeceğini gösteren ayırt edici bir sınırlayıcıdır. Böyle bir sınırlayıcı çizgi, sınır parametre değerinden sonra iki tane daha tire eklenmesiyle, önceki sınırlayıcı çizgilerle aynıdır.

İşte keyfi bir sınır kullanan bir örnek:

Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary"

--another cool boundary
Content-Disposition: form-data; name="foo"

bar
--another cool boundary
Content-Disposition: form-data; name="baz"

quux
--another cool boundary--

2
Bu cevabı en çok beğeniyorum çünkü RFC'den kısa çizgilerin nasıl belirtildiği hakkında alıntı yapıyor .
Rick

@Rick IETF'in bunu yapmasının geçerli bir nedeni var - hepsi hemen hemen aynı görünüyor olsa da, aşağıdaki dört karakterden sadece biri doğru kısa çizgi karakteri: ˗ - - -
antichris

ha, hiper dediğimde, cevabın standartta hangi hiperlerin tanımlandığını söyledi. Hangi hiperlerin "müşteri tanımlı" ve hangilerinin "spesifikasyon tanımlı" olduğu konusunda kafam karıştı
Rick

31

multipart / form-data, ad / değer çiftlerini ayırmak için sınır içerir . Sınır, bir form gönderildiğinde geçirilen her bir ad / değer çiftinin işaretçisi gibi davranır. Sınır, otomatik olarak bir istek üstbilgisinin içerik türüne eklenir.

İle Form enctype = "multipart / form-data" özniteliği bir istek başlığı Content-Type sahip olacaktır: çok parçalı / formu-verileri; sınır --- WebKit193844043-h ( tarayıcı tarafından oluşturulan kasa ).

Geçilen yük aşağıdaki gibi görünür:

Content-Type: multipart/form-data; boundary=---WebKitFormBoundary7MA4YWxkTrZu0gW

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”file”; filename=”captcha
    Content-Type:

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”action

    submit
    -----WebKitFormBoundary7MA4YWxkTrZu0gW--

Web hizmeti tarafında, @Consumes ("çoklu bölüm / form verileri") biçiminde tüketilir.

Web servisinizi krom postacı kullanarak test ederken, ek göndermek için açılır kutudan form verisi seçeneğini (radyo düğmesi) ve Dosya menüsünü kontrol etmeniz gerekir. Çok parçalı / form verileri olarak içerik türünün açıkça sağlanması bir hata atar. Çünkü, düzgün çalışan sınırı ekleyerek postacıyı içerik türüyle sunucuya kıvırma isteğini geçersiz kıldığından sınır eksiktir.

Bkz. RFC1341 sec7.2 Çok Parçalı İçerik Türü

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.