php - decodificar - mostrar imagen base64 html
Lentitud encontrada cuando la imagen de base 64 selecciona y codifica desde la base de datos (3)
Como regla general, no guarde archivos en la base de datos.
¿Qué dice el manual de mysql al respecto? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html
Con los servidores web, almacene imágenes y otros activos binarios como archivos, con el nombre de la ruta almacenado en la base de datos en lugar del archivo en sí. La mayoría de los servidores web son mejores para almacenar en caché los archivos que el contenido de la base de datos, por lo que el uso de archivos es generalmente más rápido. (Aunque debe manejar las copias de seguridad y los problemas de almacenamiento usted mismo en este caso).
No guarde archivos codificados en base4 en una base de datos
Funciona bien, pero toma tanto tiempo como esperaba. Por lo tanto, las imágenes tienen un tamaño 33% más grande y se ven totalmente voluminosas.
Como descubrió, la sobrecarga no deseada en la codificación / decodificación + espacio adicional se agotó, lo que significa una transferencia de datos adicional de ida y vuelta también.
Como @ mike-m ha mencionado. La codificación Base64 no es un método de compresión. ¿Por qué usar la codificación Base64 también se responde con un enlace que @ mike-m publicó ¿Para qué se usa la codificación base 64?
En resumen, no hay nada que ganar y mucho que perder con las imágenes de codificación base64 antes de almacenarlas en el sistema de archivos, ya sea S3 o de otra manera.
¿Qué pasa con Gzip u otras formas de compresión sin involucrar a base64? Nuevamente, la respuesta es que no hay nada que ganar y mucho que perder. Por ejemplo, acabo de comprimir una imagen JPEG de 1941980 y guardé 4000 bytes, lo que representa un ahorro del 0.2%.
La razón es que las imágenes ya están en formatos comprimidos. No se pueden comprimir más.
Cuando almacena imágenes sin compresión, se pueden entregar directamente a los navegadores y otros clientes y se pueden almacenar en caché. Si están comprimidos (o codificados en base64), su aplicación debe descomprimirlos.
Los navegadores modernos pueden mostrar imágenes de base64 incrustadas en el HTML, pero no se pueden almacenar en caché y los datos son aproximadamente un 30% más grandes de lo necesario.
¿Es esto una excepción a la norma?
El usuario puede publicar allí datos e imágenes y todos son seguros.
Supongo que quiere decir que un usuario puede descargar imágenes que le pertenecen o que comparte con él. Esto se puede lograr fácilmente guardando los archivos fuera del espacio web en el sistema de archivos y guardando solo la ruta en la base de datos. Luego, el archivo se envía al cliente (después de hacer las verificaciones requeridas) con fpassthru
¿Qué pasa cuando crezca a 100000 usuarios?
Cómo se preocupan por el archivo de imágenes. En el problema de rendimiento, cuando un gran usuario está involucrado, me parece que necesito una carpeta de 100000 para un usuario de 100000 y su subcarpeta. Cuando una gran cantidad de usuarios navega por la misma carpeta raíz, cómo procesa el sistema de archivos cada carpeta única.
Use un CDN o use un sistema de archivos especialmente adecuado para esto como BTRFS
La base de datos tiene un buen servicio de búsqueda, una buena conexión segura para subprocesos, una buena administración de sesión. ¿Se cambia este escenario cuando se trata de una operación grande
Si de hecho. Úselo al máximo guardando toda la información sobre el archivo y su ruta en la base de datos. Luego guarde el archivo en el sistema de archivos. Obtienes lo mejor de ambos mundos.
Estoy trabajando en un marco iónico. Actualmente diseña una página de publicaciones con texto e imágenes. El usuario puede publicar allí datos e imágenes y todos son seguros.
Entonces, uso la codificación base 64 y guardo la imagen en la base de datos.
encodeURIComponent($scope.image)
Cada vez que el usuario lo solicita, selecciono filas de la tabla y las visualizo junto con el texto y las decodifico.
decodeURIComponent($scope.image)
con
"data:image/jpeg;base64,_______"
HTML
"data:image/jpeg;base64,_______"
conversión
"data:image/jpeg;base64,_______"
.
Funciona bien, pero toma tanto tiempo como esperaba. Por lo tanto, las imágenes tienen un tamaño 33% más grande y se ven totalmente voluminosas.
Entonces decido moverme en el complemento de carga de archivos de cordova. Pero me doy cuenta, mantener el archivo de esta manera es mucho riesgo y completo. También trato de guardar datos binarios en la base de datos. Pero falló.
La selección de texto sin datos base64 reduce drásticamente el tiempo. Si es posible seleccionar una imagen individualmente en otra llamada http, después de seleccionar otra columna y mostrar. ¿Es un mecanismo adecuado para manejar imágenes seguras?
Como solo se trata de archivos personales, puede almacenarlos en S3.
Para estar seguro acerca de las cargas de archivos, simplemente verifique el tipo de mime del archivo antes de cargar el almacenamiento que elija.
http://php.net/manual/en/function.mime-content-type.php
simplemente ejecute una verificación rápida en el archivo cargado:
$mime = mime_content_type($file_path);
if($mime == ''image/jpeg'') return true;
¡no es gran cosa!
mantener archivos en la base de datos es una mala práctica, debería ser su último recurso. S3 es ideal para muchos casos de uso, pero es costoso para usos elevados y los archivos locales deben usarse solo para intranets y aplicaciones no públicas disponibles.
En mi opinión, ve a S3.
El SDK de Amazon es fácil de usar y obtienes un almacenamiento gratuito de 1 GB para realizar pruebas. También puede usar su propio servidor, solo manténgalo fuera de su base de datos.
Solución para almacenar imágenes en el sistema de archivos
Digamos que tienes 100.000 usuarios y cada uno de ellos tiene 10 fotos. ¿Cómo manejas almacenarlo localmente? Problema: el sistema de archivos de Linux se rompe después de unas docenas de miles de imágenes, por lo tanto, debe hacer que la estructura del archivo evite que
Solución: haga que el nombre de la carpeta sea ''abs (ID de usuario / 1000) * 1000'' / ID de usuario
De esta forma, cuando tenga el usuario con el ID 989787, sus imágenes se almacenarán en la carpeta 989000/989787 / img1.jpeg 989000/989787 / img2.jpeg 989000/989787 / img3.jpeg
y ahí lo tienes, una forma de almacenar imágenes para un millón de usuarios que no rompe el sistema de archivos unix.
¿Qué hay de los tamaños de almacenamiento?
El mes pasado tuve que comprimir 1.3 millones de archivos JPEG para el comercio electrónico en el que trabajo. Al cargar imágenes, comprima usando imagick con banderas sin pérdidas y 80% de calidad. Eso eliminará los píxeles invisibles y optimizará su almacenamiento. Dado que nuestras imágenes varían de 40x40 (miniaturas) a 1500x1500 (imágenes con zoom), tenemos un promedio de 700x700 imágenes, multiplicado por 1.3 millones de imágenes que ocuparon alrededor de 120GB de almacenamiento.
Entonces, sí, es posible almacenarlo todo en su sistema de archivos.
Cuando las cosas comienzan a ponerse lentas, contratas un CDN.
¿Cómo funcionará eso?
El CDN se encuentra frente a su servidor de imágenes, cada vez que se solicita un CDN para un archivo, si no lo encuentra en su almacenamiento (falta de caché) lo copiará de su servidor de imágenes. Más tarde, cuando se solicite nuevamente el CDN, entregará la imagen desde su propio caché.
De esta forma, no se necesita ningún código para migrar a una entrega de imagen de CDN, todo lo que tendrá que hacer es cambiar las URL en su sitio y contratar una CDN, lo mismo funciona para un depósito S3.
No es un servicio barato, pero es mucho más barato que en la nube y cuando llegue al punto de necesitarlo, probablemente pueda pagarlo.
Le sugiero que continúe solo con la cadena base64, puede usar la técnica de compresión de cadena LZ para reducir el tamaño de la cadena. He estado usando y está funcionando bastante bien.
No sé cómo estoy cerca de tu pregunta, pero espero que esto te ayude. Aquí está la técnica de compresión LZ: https://github.com/pieroxy/lz-string/