Разбор имени файла заголовка размещения содержимого в multipart / from-data - PullRequest
10 голосов
/ 29 мая 2010

Согласно RFC, в заголовке multipart / form-data content-disposition поле имени файла получает в качестве параметра строку HTTP в кавычках - строка между кавычками где символ '\' может экранировать любой другой символ 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"

Итак ... как бы вы предложили решить эту проблему?

У кого-нибудь есть идея?

Ответы [ 2 ]

2 голосов
/ 30 мая 2010

Есть ли причина, по которой вам вообще нужно анализировать это имя файла?

По крайней мере, единственное, что согласуется, это то, что часть заголовка filename заканчивается двойной кавычкой, так что вам просто нужно прочитать все, что находится между filename=" и final " .

Тогда вы, вероятно, можете рассматривать любую обратную косую черту, кроме \\, \" или \", как буквальную обратную косую черту, если только вы не думаете, что пользователи будут загружать имена файлов с вкладками в них. :)

1 голос
/ 18 мая 2016

Хотя это старая ветка, добавьте приведенное ниже решение 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...