2010-05-29 11 views
10

Zgodnie z RFC, w nagłówku treści wieloczęściowy/formularz-dane nagłówek nazwa pliku odbiera jako parametr łańcuch cytowany przez HTTP - ciąg znaków między znakami, gdzie znak "\" może uciec jakakolwiek inna postać ASCII.Parsowanie nazwy pliku nagłówka zawartości w wieloczęści/z danych

Problem polega na tym, że przeglądarki internetowe tego nie robią.

IE6 wysyła:

Content-Disposition: form-data; name="file"; filename="z:\tmp\test.txt" 

Zamiast oczekiwać

Content-Disposition: form-data; name="file"; filename="z:\\tmp\\test.txt" 

który powinien być analizowany jako z:tmptest.txt według zasad zamiast z:\tmp\test.txt.

Firefox, Konqueror i Chrome nie uciec "znaki na przykład:

Content-Disposition: form-data; name="file"; filename=""test".txt" 

Zamiast oczekiwać

Content-Disposition: form-data; name="file"; filename="\"test\".txt" 

Więc ... jak proponujesz do radzenia sobie z tym problemem

?

Czy ktoś ma pomysł?

Odpowiedz

2

Czy istnieje powód, aby w ogóle parsować tę nazwę pliku?

Przynajmniej jedna rzecz, która jest spójna jest to, że część filename nagłówka kończy się podwójnym cudzysłowem, więc po prostu trzeba czytać wszystko pomiędzy filename=" i końcowego".

Wtedy prawdopodobnie można traktować wszelkie backslash inne niż \\, \" lub \" jako dosłownego backslashem, chyba że jest to szczególnie prawdopodobne, że użytkownicy będą przesyłania nazwy plików z zakładkami w nich. :)

+2

"Czy jest jakiś powód, aby w ogóle przeanalizować tę nazwę pliku?" - tak, chcę znać nazwę pliku;). "Przynajmniej jedną rzeczą, która jest spójna, jest to, że nazwa pliku nagłówka kończy się podwójnym cudzysłowem" Pola nazwy pliku i nazwy nie powinny być w tej określonej kolejności, więc nie należy zakładać, że nazwa pliku kończy się na końcu cudzysłów. – Artyom

+0

Want! = Need. ;) Ok, więc masz przynajmniej gwarancję, że zakończy się na '" 'lub z' "; '- z tym brakiem spójności trzeba poczynić pewne ustępstwa, na przykład polegając na tym, że użytkownicy nie umieszczają" ";" w środku swoich nazw plików :) Alternatywnie, czy korzystasz z platformy internetowej, która obsługuje Najlepszym rozwiązaniem jest przetestowanie tego atrybutu dla ciebie? –

1

Chociaż stary wątek, dodanie poniżej rozwiązania Java dla każdego, kto może być zainteresowany.

// import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.*; 

    try { 
     ContentDisposition contentDisposition = new ContentDisposition("attachment; filename=\"myfile.log\"; filename*=UTF-8''myfile.log"); 
     System.out.println(contentDisposition.getParameter("filename")); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
+0

Ponieważ pytanie nie dotyczy Javy, przydatne byłoby wyjaśnienie, w jaki sposób to rozwiązuje problem: –

+0

Zgoda. Szukając tego samego problemu, znalazłem wątek omawiający regex pattern (http://stackoverflow.com/a/27226712/3940047) Dodane to rozwiązanie, ponieważ może pomóc komuś w tym samym kontekście. Ludzie po prostu google z odpowiednimi słowami kluczowymi i mogą wylądować tutaj i jeśli są to faceci Javy, może znaleźć to przydatne. –