web-dev-qa-db-ja.com

mySQLコマンドラインから直接画像をアップロードする

MySQLに、 "BLOB"のデータ型を持つ "image"というフィールドを持つ特定のテーブルがあります。 phpからではなく、コマンドラインクライアントから直接そのフィールドに画像をアップロードできるかどうか疑問に思っていました...可能であれば、正確にどこに画像ファイルを配置すればよいですか?

19
BurninatorDor

LOAD_FILE() 関数を使用してみてください。

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

ファイル名へのパス、権限などに関する要件については、マニュアルを参照してください。

26
Bill Karwin

LOAD_FILEは、特定の権限で、ファイルがサーバーにある場合にのみ機能します。私はそれを完全にクライアント側で機能させる方法を見つけました:

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

画像をオンザフライでbase64にエンコードし、次にMySqlにデコードさせます。

6
Teudimundo

これは、Base64関数が使用できない古いMySQLバージョンで動作するTeudimundoの回答のバリエーションです。

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改行を削除し、最終的に結果をMySQL固有の16進ダンプ文字列リテラルに埋め込みます:x'...'

3
Tobia

画像をデータベースに直接アップロードしないことをお勧めします。これは非常に非効率的です。画像の場所と名前を保存し、それらの画像をどこかのフォルダに保存することをお勧めします。

コマンドラインから「アップロード」する場合は、次のように実行できます。

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

環境によっては、シェルアクセスを使用して画像を移動できます。これらのイメージで何をしようとしているのか、システムのセットアップ方法がよくわかりません。あなたはおそらくそれを明確にする必要があるでしょう。

2
mugetsu

サンプルアプリケーションをビルドしてから、データベースに値を挿入することをお勧めします。たとえば、このメソッドを使用して、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!";
                   }
0
BurninatorDor

Loadfileを使用してファイルをアップロードしようとすることがありますが、ファイルがロードされないか、フォーマットされたテキストのファイルパスがBLOBフィールドに格納されます。これはアクセスの問題が原因です。このような状況に直面している場合は、任意の場所からファイルをロードする代わりに、mysqlのデータパスからロードすることをお勧めします。

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