android - programacion - No se puede descargar el archivo con caracteres especiales de Amazon S3
curso android desarrollo de aplicaciones móviles pdf (2)
He estado tratando de descargar un archivo de Amazon S3 que termina con un carácter especial.
El nombre del archivo termina con un "=" como resultado de la codificación Base64. Ahora estoy tratando de descargar este archivo y recibo un error,
La clave especificada no existe. (Servicio: Amazon S3; Código de estado: 404; Código de error: NoSuchKey;
He intentado codificar la cadena URL. Así que ahora el "=" se convierte en "% 3D" y aún así recibo el mismo error. Pero si elimino el "=" del nombre del archivo, puedo descargarlo sin problemas. Pero este es un archivo común y también se puede acceder desde iOS.
NOTA: El iOS SDK de Amazon funciona incluso cuando el nombre del archivo tiene "=". El problema se enfrenta solo en Android SDK.
Los siguientes caracteres en el nombre de una clave pueden requerir un manejo de código adicional y es probable que tengan que estar codificados en URL o referenciados como HEX.
Algunos de estos son caracteres no imprimibles y es posible que su navegador no los maneje, lo que también requerirá un manejo especial:
Las mejores prácticas para garantizar la compatibilidad entre las aplicaciones que definen los nombres de claves están utilizando:
- Alphanumeric characters [0-9a-zA-Z]
- Special characters !, -, _, ., *, '', (, and )
Usando Android necesitas codificar el nombre del archivo, el carácter (comúnmente usado como operador):
=
a :
%3D
Según la documentación de AWS.
Personajes seguros
Los siguientes conjuntos de caracteres son generalmente seguros para su uso en nombres de clave:
Caracteres alfanuméricos [0-9a-zA-Z]
Caracteres especiales!, -, _,., *, '', (, Y)
y
Personajes que pueden requerir manejo especial
Los siguientes caracteres en el nombre de una clave pueden requerir un manejo de código adicional y es probable que tengan que estar codificados en la URL o referenciados como HEX. Algunos de estos son caracteres no imprimibles y es posible que su navegador no los maneje, lo que también requerirá un manejo especial:
Ampersand ("&")
Dólar ("$")
Los rangos de caracteres ASCII son 00–1F hex (0–31 decimal) y 7F (127 decimal).
Símbolo "en" ("@")
Igual ("=")
Punto y coma (";")
Colon (":")
Más ("+")
Espacio: las secuencias significativas de espacios pueden perderse en algunos usos (especialmente espacios múltiples)
Coma (",")
Signo de interrogación ("?")
Entonces, le confirma que "=" requiere un manejo especial. Será mejor si reemplaza el último "=" char con otro char seguro para evitar el problema ...
Por favor, intenta cambiar el " = " a " & # 61 "
Como en iOS, no hay problema, espero que sea en relación con el entorno de Android.
Puede observar que algunos caracteres también podrían estar prohibidos porque la ejecución del entorno de shell SH o BASH o ANDROID, también debe tener en cuenta que alguna opción de formato de disco (FAT32 en una tarjeta de memoria externa de Android normal) también puede representar un factor que prohíbe algunos char en el nombre del archivo.
Si echas un vistazo here y más especialmente en la respuesta @kreker:
De acuerdo con wiki y suponiendo que está utilizando un almacenamiento de datos externo que tiene FAT32.
Allowable characters in directory entries
son
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
Notarás que =
no es un char permitido en la partición FAT32 de Android ...
Como espero que Android considere = como carácter restringido, puede intentar escapar con /=
o agregar una cita al nombre del archivo en su código ...
Un ejemplo con una copia:
cp filename=.png mynewfile=.png #before
cp "filename=.png" "mynewfile=.png" #after
"VCS ... =. Png"
Si ninguno de estos trucos funciona, debe cambiar el nombre de archivo para eliminar el "=" cuando cree esos archivos.
Saludos