Stack Overflow en español Asked by Deybi Tabora Paz on November 10, 2021
Estoy tratando de decidirme por una forma para enviar imagenes a mi base de datos, y estaba pensando en mandarlas en base64 pero mayormente mis imagenes pueden pesar más de 5MB ya que son de alta resolución.
Tendría problemas al usar base64?
De que otra forma podria?
Base64 es básicamente una forma de representar datos binarios (es decir, cualquier cosa) utilizando solamente caracteres imprimibles del código ASCII (es decir, texto legible, que tiene básicamente solo letras, números y algunos símbolos de uso común).
Para responder tu pregunta entonces:
Como tal no tiene ningún límite de tamaño per se. Los límites están generalmente impuestos por el hardware y software que se utilice para procesarlo.
Siempre que tu infraestructura (hardware y software) pueda manejar el archivo resultante, que va a ser de mayor tamaño a la imagen.
Esto, porque, por definición tu puedes convertir un archivo de cualquier tamaño a su representación en Base64, que simplemente te dará un archivo más grande.
El archivo será más grande porque cada 6 bits del archivo de entrada tomarán un byte completo del archivo de salida. En otras palabras, por cada 3 bytes del archivo de entrada se ocupará 4 bytes en el archivo de salida.
Si el tamaño de tu archivo de entrada en bytes, no es múltiplo de 3, se agregará algunos bytes adicionales a la salida, cuyo tamaño siempre será múltiplo de 4.
En otras palabras, si tu codificas un archivo de 5MB, que son 5 242 880 bytes, esto producirá una salida de redondear.arriba(5242880/3) * 4
, es decir 6 990 508 bytes o 6.66MB.
Si tu infraestructura (lenguaje de programación, servidor web, base de datos, sistema operativo, memoria, disco duro, sistema de archivos, etc) soporta manejar 6.66MB, entonces no tendrás problema en manejar archivos de 5MB codificados en base64.
Como dato curioso, agregar que incluso puedes convertir un archivo de texto (que puede ya estar en base64) a base64. El algoritmo de conversión no se fija en el contenido de la entrada, simplemente va convirtiendo cada 3 bytes de entrada en 4 caracteres imprimibles en la salida, donde cada caracter ocupa un byte.
Por ejemplo, la secuencia binaria de bytes (representados en hexadecimal) 00 FF AA
, se representará en base64 como la cadena 'AP+q'
La cadena 'Hola mundo'
(en ASCII o en UTF8), quedará codificada en la cadena 'aG9sYSBtdW5kbw=='
En ese último caso, la cadena de entrada tiene 10 bytes (que no es múltiplo de 3), puedes observar como la cadena de salida tiene 16, que si es múltiplo de 4. Cualquier entrada con entre 10, 11 y 12 bytes, producirá una salida de 16.
Answered by jachguate on November 10, 2021
Base 64 es una forma de representar valores binarios en cadenas de caracteres, por definición no tiene limite de datos. Como lo dicen los comentarios el límite depende de la base de datos, pero comprendo la limitante de algunos motores o de una infraestructura ya existente.
Mi sugerencia es la siguiente:
int tamaño_bloque = 10*1024;
string b64Text = ConvertirArchivoBinario(FileReader("mi-ruta.txt"));
string []segmentos = PartirArchivosEnSegmentos(b64Text,tamaño_bloque);
y guardas con un reespectivo orden los sub-base-64 contenidos en segmentos.
ConvertirArchivoBinario : Esto varía según el lenguaje: c#
string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
PartirArchivosEnSegmentos : Se debe implementar bajo tu propio criterio.
Pros:
Puedes guardar cualquier archivo en forma de string.
No vas a tener problema con los acentos ( Sí estas guardando string en base 64 que he visto que lo hacen para "cifrar" datos es un alivio con los acentos).
Puedes implementar un FUSE (FileSystem Virtual) en un servidor de correo, o en una base de datos :)
Contras:
Requiere gasto computacional de procesador.
Requiere gasto computacional de memoria.
Toma más espacio almacenarlas.
No tienes un control de acls ( lectura/escritura/permisos ) y mucho menos puede ser leído por un AntiVirus
Si quieres comprimirlo la tasa de compresión es muy pobre.
Conclusión:
Debes evaluar esta situación y evaluar costo beneficio con un benchmark.
Answered by Fabio Andrés on November 10, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP