Загрузить изображение напрямую через командную строку mySQL - PullRequest
19 голосов
/ 09 декабря 2011

У меня есть определенная таблица в mySQL, в которой есть поле с именем "image" с типом данных "BLOB".Мне было интересно, если можно загрузить изображение в этом поле непосредственно из клиента командной строки, а не делать это через php ... Если это возможно, то где именно я должен разместить свои файлы изображений?

Ответы [ 6 ]

25 голосов
/ 09 декабря 2011

Попробуйте использовать функцию LOAD_FILE () .

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

Требования к пути к имени файла, привилегиям и т. Д. См. В руководстве

6 голосов
/ 07 декабря 2016

LOAD_FILE работает только с определенными привилегиями и если файл находится на сервере.Я нашел способ заставить его работать полностью на стороне клиента:

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

Идея состоит в том, чтобы на лету закодировать изображение в base64 и позволить MySql его декодировать.

3 голосов
/ 17 мая 2017

Это вариант ответа Teudimundo , который работает со старыми версиями MySQL, где функции Base64 недоступны:

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

Хитрость заключается в том, чтобы использовать xxd -p для преобразования двоичного файла в обычный hexdump:

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

, затем с помощью tr -d \\n удалите символы новой строки и, наконец, внедрите результат в строковый литерал hexdump, специфичный для MySQL: x'...'

2 голосов
/ 09 декабря 2011

Я рекомендую вам никогда не загружать изображения непосредственно в базу данных, это довольно неэффективно.Лучше просто сохранить местоположение и имя изображения и сохранить эти изображения в папке где-нибудь.

, и если вы хотите «загрузить» через командную строку, вы можете просто сделать:*

и в зависимости от вашей среды вы можете использовать доступ к оболочке для перемещения изображений.Я не совсем уверен, что вы пытаетесь сделать с этими изображениями или как ваша система настроена.Вы, вероятно, должны уточнить это.

0 голосов
/ 03 августа 2017

Иногда мы пытаемся загрузить файл с помощью loadfile, но файл не загружается или путь к файлу в форматированном тексте сохраняется в поле BLOB.Это из-за проблем с доступом.Если вы столкнулись с таким условием, вместо загрузки файла из любого места, попробуйте загрузить его из пути данных mysql, предпочтительно, например:

INSERT INTO `srms`.`images` (`ID`, `Image`) VALUES ('5', load_file('C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\test.jpg'));
0 голосов
/ 20 декабря 2011

Более предпочтительно создать пример приложения и затем вставить значения в базу данных. Например, этот метод можно использовать для ввода типа данных BLOB в базу данных ...

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