Не удалось загрузить файл со специальным символом из Amazon S3
Я пытаюсь загрузить файл с Amazon S3, который заканчивается специальным символом.
![введите описание изображения здесь]()
Имя файла заканчивается символом "=" в результате кодирования Base64. Теперь я пытаюсь загрузить этот файл, и я получаю сообщение об ошибке,
Указанный ключ не существует. (Сервис: Amazon S3; Код состояния: 404; Код ошибки: NoSuchKey;
![введите описание изображения здесь]()
Я пробовал URL Кодирование строки. Итак, теперь "=" становится "% 3D", и все же я получаю ту же ошибку.
Но если я удалю "=" из имени файла, я могу загрузить файл без проблем. Но это общий файл, и к нему также нужно получить доступ к форме iOS.
ПРИМЕЧАНИЕ. SDK iOS Amazon работает даже тогда, когда имя файла имеет "=".
Проблема связана только с Android SDK.
Ответы
Ответ 1
Следующие символы в ключевом имени могут потребовать дополнительный код и, вероятно, потребуется кодирование URL или ссылка на него как HEX.
Некоторые из них являются непечатаемыми символами, и ваш браузер может не обрабатывать их, что также потребует специальной обработки:
![введите описание изображения здесь]()
Лучшие методы для обеспечения совместимости между приложениями, определяющими имена ключей, используются:
- Alphanumeric characters [0-9a-zA-Z]
- Special characters !, -, _, ., *, ', (, and )
Используя android, вам нужно закодировать имя файла, символ (обычно используемый как оператор):
=
to:
%3D
Ответ 2
Согласно Документация AWS
Безопасные символы
Следующие обозначения символов обычно безопасны для использования в именах ключей:
Буквенно-цифровые символы [0-9a-zA-Z]
Специальные символы!, -, _,., *, ', (, и)
и
Персонажи, которые могут потребовать специальной обработки
Следующие символы в имени ключа могут потребовать дополнительной обработки кода и, вероятно, должны быть закодированы в URL или указаны как HEX. Некоторые из них являются непечатаемыми символами, и ваш браузер может не обрабатывать их, что также потребует специальной обработки:
Амперсанд ( "&" )
Доллар ( "$" )
Символы символов ASCII 00-1F hex (0-31 десятичный) и 7F (127 знаков после запятой)
Символ "В" ( "@" )
Равные ( "=" )
Точка с запятой ( ";" )
Colon ( ":" )
Плюс ( "+" )
Пространство - Значительные последовательности пространств могут быть потеряны в некоторых целях (особенно в нескольких местах)
Запятая ( "," )
Вопросительный знак ( "?" )
Поэтому он подтверждает, что "=" требует специальной обработки,
Будет лучше, если вы замените последний "=" char на другой безопасный char, чтобы избежать проблемы...
Попробуйте изменить "=" на " и # 61"
Как и в iOS, проблем нет, я ожидаю, что это может быть относительно среды Android.
Вы можете заметить, что некоторые символы также могут быть запрещены, поскольку выполнение оболочки оболочки SH или BASH или ANDROID,
пожалуйста, также учтите, что некоторая опция формата диска (FAT32 на обычной внешней карте памяти Android) также может представлять собой фактор, который запрещает использование некоторого char в имени файла.
Если вы посмотрите здесь и особенно на ответ @kreker:
Согласно wiki и предполагая, что вы используете внешнее хранилище данных, которое имеет FAT32.
Allowable characters in directory entries
являются
Any byte except for values 0-31, 127 (DEL) and: " * / : < > ? \ | + , . ; = [] (lowcase a-z are stored as A-Z). With VFAT LFN any Unicode except NUL
Вы заметите, что =
не разрешен char на разделе Android FAT32...
Поскольку я ожидаю, что Android рассмотрит = как ограниченный char, вы можете попытаться избежать его с помощью \=
или добавить цитату к имени файла в вашем коде...
Пример с копией:
cp filename=.png mynewfile=.png #before
cp "filename=.png" "mynewfile=.png" #after
"VCS... =. PNG"
Если ничего из этого трюка не будет работать, вы должны изменить имя файла, чтобы удалить "=" при создании этих файлов.
Привет