web-dev-qa-db-fra.com

Importer une image directement via la ligne de commande mySQL

J'ai une certaine table dans MySQL qui a un champ appelé "image" avec un type de données de "BLOB". Je me demandais s'il est possible de télécharger une image dans ce champ directement à partir du client en ligne de commande plutôt que via php ... Si c'est possible, où dois-je placer exactement mes fichiers image?

19
BurninatorDor

Essayez d’utiliser la fonction LOAD_FILE () .

UPDATE `certain_table`
SET image = LOAD_FILE('/full/path/to/new/image.jpg')
WHERE id = 1234;

Consultez le manuel pour connaître les exigences relatives au chemin d'accès au nom de fichier, aux privilèges, etc.

24
Bill Karwin

LOAD_FILE fonctionne uniquement avec certains privilèges et si le fichier se trouve sur le serveur. J'ai trouvé un moyen de le faire fonctionner complètement côté client:

mysql -e "update mytable set image=FROM_BASE64('`base64 -i image.png`')" DBNAME

L'idée est de coder l'image en base64 à la volée et de laisser ensuite MySql la décoder.

6
Teudimundo

Je vous recommande de ne jamais télécharger des images directement dans une base de données, c'est assez inefficace. Il est préférable de simplement stocker l'emplacement et le nom de l'image et de stocker ces images dans un dossier quelque part.

et si vous voulez "télécharger" via la ligne de commande, vous pouvez simplement faire un:

insert into table(image_loc) values('/images/random/cool.jpg') where id=1;

et en fonction de votre environnement, vous pouvez utiliser l'accès Shell pour déplacer des images. Je ne suis pas certain de ce que vous essayez de faire avec ces images ou de la configuration de votre système. Vous aurez probablement besoin de clarifier cela.

3
mugetsu

Ceci est une variante de la réponse de Teudimundo qui fonctionne avec les anciennes versions de MySQL, où les fonctions Base64 ne sont pas disponibles:

mysql -e "update mytable set col = x'$(xxd -p image.png | tr -d \\n)' where ..."

L'astuce consiste à utiliser xxd -p pour convertir un fichier binaire en fichier hexadécimal complet:

$ xxd -p /usr/share/font-manager/data/blank.png
89504e470d0a1a0a0000000d4948445200000040000000400806000000aa
6971de000000274944415478daedc1010d000000c220fba77e0e37600000
00000000000000000000000000c0bd0040400001ee1dbb2f000000004945
4e44ae426082

puis en utilisant tr -d \\n pour supprimer les retours à la ligne, puis en incorporant le résultat dans un littéral de chaîne hexdump spécifique à MySQL: x'...'

2
Tobia

Il est préférable de créer un exemple d'application, puis d'insérer les valeurs dans la base de données. Par exemple, cette méthode pourrait être utilisée pour entrer un type de données BLOB dans la base de données ...

[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!";
                   }
0
BurninatorDor

Parfois, nous essayons de télécharger un fichier en utilisant loadfile mais le fichier n’est pas chargé ou le chemin du fichier dans le texte formaté est stocké dans le champ BLOB. C'est à cause de problèmes d'accès. Si vous faites face à une telle condition, au lieu de charger un fichier depuis n'importe quel emplacement, essayez de le charger depuis le chemin de données de mysql, de préférence comme ceci:

INSERT INTO `srms`.`images` (`ID`, `Image`) VALUES ('5', load_file('C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\test.jpg'));
0
sushil surana