Как определить, есть ли в имени файла знак плюса (+)?

Таким образом, AWS преобразует пробел в + для URL-адреса корзины / файла. Но имя файла, в котором уже есть +, кодируется как %2B. Я не понимаю, как вести себя в этом случае.

Когда входной URL-адрес для приложения:

https://s3-us-west-2.amazonaws.com/mybucket/Pul0419_32_a+b.zip

как мне решить, является ли существующий файл Pul0419_32_a+b.zip или Pul0419_32_a b.zip


person Community    schedule 20.04.2016    source источник
comment
Вы можете попытаться получить информацию об URI $_SERVER['QUERY_STRING'] или $_SERVER['REQUEST_URI']   -  person Dolbik    schedule 20.04.2016
comment
@Dolbik Данные отправляются как JSON вместе с POST запросом   -  person    schedule 20.04.2016
comment
Если вы urldecode() имя файла из строки запроса, то все, что он выводит, будет соответствовать имени файла. Он преобразует %2B в + и + в пробел.   -  person Rasclatt    schedule 20.04.2016
comment
@Rasclatt Что, если в имени файла изначально был знак плюса Pul0419_32_a+b.zip? Откуда мне это знать?   -  person    schedule 20.04.2016
comment
Потому что urldecode () конвертирует его за вас. Вам не о чем беспокоиться. Если есть плюс, сервер автоматически преобразует его с помощью такой функции, как urlencode (), поэтому вы можете просто декодировать его.   -  person Rasclatt    schedule 20.04.2016
comment
@Rasclatt a b получен как a b, а a+b получен как a+b. Это проблема. Я отправляю POST запрос с данными как JSON. Пример ввода: `{file_path: s3-us-west -2.amazonaws.com/pts/ds/MXF/TEST/a b.mxf}   -  person    schedule 20.04.2016
comment
Хорошо, я все еще не вижу здесь проблемы. Это все еще кажется простым. Можете ли вы показать пример кода, который дополнительно иллюстрирует то, что вы имеете в виду?   -  person Rasclatt    schedule 20.04.2016
comment
Позвольте нам продолжить это обсуждение в чате.   -  person    schedule 20.04.2016
comment
Меня это тоже укусило. Теперь мы переписываем все загрузки пользователей в случайное имя файла.   -  person ceejayoz    schedule 21.04.2016


Ответы (1)


Я энтузиаст AWS, я должен признать, что первоначальные архитекторы S3 сделали крайне досадную ошибку, когда решили, что + в пути URL-адреса следует интерпретировать так, как если бы он был эквивалентен ASCII 0x20 («пробел»).

Символ + имеет это значение только тогда, когда является частью строки запроса. В пути это следовало интерпретировать буквально.

В пути правильно закодированного и интерпретированного URL-адреса + эквивалентно %2B.

Таким образом, на этот вопрос нет надежного ответа из-за фундаментального недостатка, из-за которого S3 неправильно обрабатывает правильные URL-адреса.

Учитывая тот факт, что если бы URL-адрес примера использовался браузером, S3 предположил бы, что это были пробелы, ваши интересы, вероятно, будут лучше всего удовлетворены, если не преобразовывать URL-адрес для использования %2B, а использовать его как есть при взаимодействии с S3. .. если практический опыт не показывает, что исходный источник этих URL-адресов действительно взаимодействовал с S3 и действительно преобразовал их в %2B, не сохраняя их для последующего использования с согласованной кодировкой; в этом случае можно привести аргумент, что они предоставляются вам неверно, но вам, возможно, все равно придется их преобразовать по причинам, которые могут быть скорее политическими, чем техническими.

Но, как вы, кажется, уже подозреваете, ответ не так однозначен.

person Michael - sqlbot    schedule 21.04.2016