Разбор содержимого имени файла заголовка содержимого в multipart/from-data
В соответствии с RFC, в заголовке content-disposition multipart/form-data
Поле filename получает в качестве параметра HTTP quoted string - строка между quites, где
символ '\' может избежать любого другого символа ascii.
Проблема в том, что веб-браузеры этого не делают.
IE6 отправляет:
Content-Disposition: form-data; name="file"; filename="z:\tmp\test.txt"
Вместо ожидаемого
Content-Disposition: form-data; name="file"; filename="z:\\tmp\\test.txt"
Кого следует анализировать как z:tmptest.txt
в соответствии с правилами вместо z:\tmp\test.txt
.
Firefox, Konqueror и Chrome не выходят из символов, например:
Content-Disposition: form-data; name="file"; filename=""test".txt"
Вместо ожидаемого
Content-Disposition: form-data; name="file"; filename="\"test\".txt"
Итак... как бы вы предложили решить эту проблему?
Есть ли у кого-нибудь идеи?
Ответы
Ответ 1
Есть ли причина, по которой вам необходимо полностью проанализировать это имя файла?
По крайней мере одно единственное, что согласуется с тем, что часть filename
заголовка заканчивается двойной кавычкой, так что вам просто нужно прочитать все между filename="
и окончательным "
.
Затем вы можете обработать любую обратную косую черту, отличную от \\
, \"
или \"
, как литеральную обратную косую черту, если вы не считаете, что особенно вероятно, что пользователи будут загружать имена файлов с вкладками в них.:)
Ответ 2
Хотя старый поток, добавляя ниже java-решение для тех, кто может быть заинтересован.
// 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();
}