que - todo sobre mysql
Sube la imagen directamente a través de la línea de comandos mySQL (6)
Tengo una tabla determinada en mySQL que tiene un campo llamado "imagen" con un tipo de datos de "BLOB". Me preguntaba si es posible cargar una imagen en ese campo directamente desde el Cliente de la línea de comandos en lugar de hacerlo a través de php ... Si es posible, ¿dónde debería colocar exactamente mis archivos de imágenes?
A veces intentamos cargar un archivo usando loadfile pero el archivo no está cargado o la ruta del archivo en texto formateado se almacena en el campo BLOB. Esto se debe a problemas de acceso. Si se enfrenta a dicha condición, en lugar de cargar un archivo desde cualquier ubicación, intente cargarlo desde la ruta de datos de mysql, preferiblemente de la siguiente manera:
INSERT INTO `srms`.`images` (`ID`, `Image`) VALUES (''5'', load_file(''C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/test.jpg''));
Es más preferible compilar una aplicación de muestra y luego insertar los valores en la base de datos. Por ejemplo, este método podría usarse para ingresar un tipo de datos BLOB en la base de datos ...
[WebMethod]
public string sendDataToMySql(string get_name, byte[] buffer)
{
string MyConString = "SERVER=localhost;" +
"DATABASE=test;" +
"UID=root;" +
"PASSWORD=admin;";
MySqlConnection connection = new MySqlConnection(MyConString);
connection.Open();
MySqlCommand command = new MySqlCommand("", connection);
command.CommandText = "insert into testImage(name, image) values(@name, @image);";
MySqlParameter oParam1 = command.Parameters.Add("@name", MySqlDbType.VarChar, 50);
oParam1.Value = get_name;
MySqlParameter oParam2 = command.Parameters.Add("@image", MySqlDbType.Blob);
oParam2.Value = buffer;
command.ExecuteNonQuery();
connection.Close();
return "Data was inserted successfully!";
}
Esta es una variación de la respuesta de Teudimundo que funciona con versiones anteriores de MySQL, donde las funciones Base64 no están disponibles:
mysql -e "update mytable set col = x''$(xxd -p image.png | tr -d //n)'' where ..."
El truco es usar xxd -p
para convertir un archivo binario en un volcado hexadecimal simple:
$ xxd -p /usr/share/font-manager/data/blank.png
89504e470d0a1a0a0000000d4948445200000040000000400806000000aa
6971de000000274944415478daedc1010d000000c220fba77e0e37600000
00000000000000000000000000c0bd0040400001ee1dbb2f000000004945
4e44ae426082
luego, usando tr -d //n
para eliminar las nuevas líneas, y finalmente incrustando el resultado en un literal de cadena hexdump específico de MySQL: x''...''
Intenta usar la función LOAD_FILE() .
UPDATE `certain_table`
SET image = LOAD_FILE(''/full/path/to/new/image.jpg'')
WHERE id = 1234;
Consulte el manual para conocer los requisitos sobre la ruta al nombre de archivo, privilegios, etc.
Te recomiendo que nunca cargues imágenes directamente en una base de datos, es bastante ineficiente. Es mejor simplemente almacenar la ubicación y el nombre de la imagen y almacenar esas imágenes en una carpeta en algún lugar.
y si desea "cargar" a través de la línea de comandos, puede simplemente hacer un:
insert into table(image_loc) values(''/images/random/cool.jpg'') where id=1;
y dependiendo de su entorno, puede usar el acceso de shell para mover las imágenes. No estoy muy seguro de qué intenta hacer con estas imágenes o de cómo está configurado su sistema. Probablemente tengas que aclarar eso.
LOAD_FILE
funciona solo con ciertos privilegios y si el archivo está en el servidor. He encontrado una manera de hacerlo funcionar completamente del lado del cliente:
mysql -e "update mytable set image=FROM_BASE64(''`base64 -i image.png`'')" DBNAME
La idea es codificar la imagen a base64 sobre la marcha y dejar que MySql la decodifique.