MySQLに画像を保存する方法

MySQLに画像を保存する方法

1 はじめに

データベースを設計する場合、画像や音声ファイルをデータベースに挿入することは避けられません。一般的に言えば、ファイル自体ではなく、画像ファイルの対応する保存場所を挿入することで、データベースに直接挿入する手間を回避できます。しかし、場合によっては、MySQL に画像を挿入する方が管理しやすいこともあります。では、MySQL にどのように保存するのでしょうか?

参考文献[1]にはかなり明確な例が含まれていますが、これはMySQLのグラフィカルクエリツールQuery Browerに基づいています。マシンにインストールされていない場合は、よく理解できない可能性があります。ここでは詳細には触れませんので、詳しい情報については提供されているリンクを参照してください。

さらに、[1]の例はQuery Browerの使いやすさとパワーを示しているだけであり、私たちの開発ではあまり実用的ではありません。それでは、JAVA を使用して MySQL にデータを保存する簡単な例を書いてみましょう。

2 テーブルを作成する

まず、データベースにテーブルを作成する必要があります。 test というデータベースに pic というテーブルを作成しました。表には、idpic、caption、img の 3 つの列が含まれます。このうち、idpic は主キー、caption は画像の説明、img は画像ファイルそのものです。テーブルを作成するための SQL ステートメントは次のとおりです。

`test`.`pic` が存在する場合はテーブルを削除します。
テーブル `test`.`pic` を作成します (
 `idpic` int(11) NOT NULL auto_increment,
 `caption` varchar(45) NOT NULL デフォルト ''
 `img` longblob NULLではありません、
 主キー (`idpic`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

上記のステートメントをコマンドラインに入力し(クエリブラウザがインストールされている場合は、参考文献[1]の指示に従ってテーブルを作成すると便利です)、実行すると、テーブルが正常に作成されます。

3 画像ストレージクラスの実装

テーブルが完成したら、データベースに画像を挿入する操作を完了するための Java クラスの作成を開始します。 Java とデータベースの接続は、JDBC ドライバーを通じて実現されることがわかっています。 MySQL の Web サイトで提供されている MySQL Connector/J を使用します。別の種類のドライバーを使用する場合は、以下の実装に若干の違いがある可能性があります。

3.1 JDBCドライバをロードして接続を確立する

JDK で提供される DriverManager インターフェイスは、Java アプリケーションと JDBC ドライバー間の接続を管理するために使用されます。このインターフェースを使用する前に、DriverManager は接続する JDBC ドライバーを認識している必要があります。最も簡単な方法は、Class.forName() を使用して、java.sql.Driver を実装するインターフェース クラスを DriverManager に登録することです。 MySQL Connector/J の場合、クラス名は com.mysql.jdbc.Driver です。

次の簡単な例は、Connector/J ドライバーを登録する方法を示しています。

java.sql.Connection をインポートします。
java.sql.DriverManager をインポートします。
java.sql.SQLException をインポートします。
 
パブリッククラス LoadDriver {
  パブリック静的voidメイン(String[] args) {
    試す {
      // newInstance() 呼び出しは、いくつかの回避策です
      // 壊れた Java 実装
      クラス.forName("com.mysql.jdbc.Driver").newInstance();
      
      // 接続 con = DriverManager.getConnection(……)
      // ...
    } catch (例外例) {
      // エラーを処理する
    }
}

ドライバーを DriverManager に登録した後、 DriverManager.getConnection()メソッドを呼び出してデータベースへの接続を取得できます。実際、このステートメントは上記の例に存在しますが、コメントアウトされています。次の実装に完全な例があります。

3.2 準備されたステートメント

上記の手順を完了すると、確立された接続を介して Statement インターフェイス クラスを作成し、いくつかの SQL ステートメントを実行できます。次の例では、いくつかのストアド プロシージャと関数を実行できる PreparedStatement と CallableStatement を使用していますが、ここではそれらについては説明しません。次のコード スニペットは、pic テーブルにレコードを挿入します。ここで、(1) Connection インターフェースのオブジェクト con は、prepareStatement メソッドを呼び出して、プリコンパイルされた SQL ステートメントを取得します。(2) 挿入ステートメントの最初の疑問符に値を割り当て、(3) 2 番目に値を割り当て、(4) 3 番目に値を割り当てます。このステップは最も注目に値します。使用されるメソッドは setBinaryStream() です。最初のパラメータ 3 は 3 番目の疑問符を参照し、fis はバイナリ ファイル ストリーム、3 番目のパラメータはファイル ストリームの長さです。

準備されたステートメント ps;
…
ps = con.prepareStatement("PIC値に挿入する (?,?,?)"); // (1)
ps.setInt(1, id); //(2)
ps.setString(2, file.getName()); (3)
ps.setBinaryStream(3, fis, (int)file.length()); (4)
ps.executeUpdate();
…

3.3 完全なコード

完全なコードは上記に記載されています。

パッケージ com.forrest.storepic;
 java.io.File をインポートします。
java.io.FileInputStream をインポートします。
java.sql.Connection をインポートします。
java.sql.DriverManager をインポートします。
java.sql.PreparedStatement をインポートします。
java.sql.ResultSet をインポートします。
java.sql.SQLException をインポートします。
 
/**
 * このクラスでは、画像ファイルを MySQL に保存する方法について説明します。
 * @author ヤンジャン・チェン
 * @バージョン 1.0 2006 年 1 月 2 日
 */
パブリッククラスStorePictures {
  
  プライベート文字列 dbDriver;
  プライベート文字列 dbURL;
  プライベート文字列 dbUser;
  プライベート文字列 dbPassword;
  プライベート接続con;
  プライベート PreparedStatement ps; 
 
  パブリックStorePictures() {
    dbDriver = "com.mysql.jdbc.Driver";
    dbURL = "jdbc:mysql://localhost:3306/test";
    dbUser = "root";
    dbPassword = "admin";
    初期化DB();
  }
  
  パブリックStorePictures(文字列strDriver、文字列strURL、
      文字列 strUser、文字列 strPwd) {
    dbDriver = strDriver;
    dbURL = strURL;
    dbUser = strUser;
    dbPassword = strPwd;
    初期化DB();
  }
 
  パブリックボイドinitDB() {
    試す {
      // ドライバーをロード
      クラス.forName(dbDriver).newInstance();
      // 接続を取得
      con = DriverManager.getConnection(dbURL,
          dbUser、dbPassword);      
    } キャッチ(ClassNotFoundException e) {
      System.out.println(e.getMessage());
    } キャッチ(SQLException ex) {
      // エラーを処理する
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("ベンダーエラー: " + ex.getErrorCode());
 
    } キャッチ (例外 e) {
      System.out.println(e.getMessage());
    }
  }
 
  パブリックブールストアImg(String strFile)は例外をスローします{
    ブール値が false と書かれています。
    (con == null)の場合
      記述 = false;
    それ以外 {
      整数ID = 0;
      ファイル file = new File(strFile);
      FileInputStream fis = 新しい FileInputStream(file);
      
      試す {       
        ps = con.prepareStatement("PICからMAX(idpic)を選択");
        結果セット rs = ps.executeQuery();
        
        if(rs != null) {
          while(rs.next()) {
            id = rs.getInt(1)+1;
          }
        } それ以外 {    
          書面で返却する。
        }
        
        ps = con.prepareStatement("挿入"
            + "PIC値(?、?、?)に");
        ps.setInt(1, ID);
        ps.setString(2, file.getName());
        ps.setBinaryStream(3, fis, (int) ファイル.length());
        ps.executeUpdate();
        
        記述 = true;
      } キャッチ (SQLException e) {
        記述 = false;
        System.out.println("SQLException: "
            + e.getMessage();
        System.out.println("SQLState: "
            + e.getSQLState();
        System.out.println("ベンダーエラー: "
            + e.getErrorCode());
        e.printStackTrace();
      ついに       
        ps.close();
        fis.close();
        // DB接続を閉じる
        con.close();
      }
    }
    書面で返却する。
  }
  
  /**
   * プログラムの開始点
   * @param args CMD 行
   */
  パブリック静的voidメイン(String[] args) {
    引数の長さが 1 ではない場合
      System.err.println("java StorePictures ファイル名");
      システム終了(1);
    }
    ブールフラグ = false;
    ストアピクチャ sp = 新しいストアピクチャ();
    試す {
      フラグ = sp.storeImg(args[0]);
    } キャッチ (例外 e) {
      e.printStackTrace();
    }
    if(フラグ) {
      System.out.println("画像のアップロードが成功しました。");
    } それ以外 {
      System.out.println("画像のアップロードに失敗しました。");
    }
  }
}

4 結論

ここまでで、MySQL に画像を保存するプロセス全体を紹介しました。この例は最も単純なものです。読者は実際のニーズに応じて、ファイルの読み取り、削除などの他の機能を追加して、プログラム全体をより完璧にすることができます。本稿執筆にあたり、主に文献[2]を参考にさせていただきました。ここに感謝申し上げます。参考文献[3]は非常に美しい例であり、保存だけでなく読み取りも可能で、非常に直感的なグラフィカルインターフェイスを備えています。興味のある方は、詳しく研究することができます。

以上が、私がご紹介したMySQLで写真を保存する方法です。お役に立てれば幸いです。ご質問があれば、メッセージを残していただければ、すぐに返信させていただきます。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • MySQL にテキストと画像を保存する方法
  • PHP を使用して MySQL の BLOB フィールドを操作する方法の例 [テキストと画像の保存]
  • Express は、フロントエンドとバックエンドの通信を実現し、写真をアップロードして愚か者のためにデータベース (mysql) に保存します (パート 2)
  • Express は、フロントエンドとバックエンドの通信を実現し、写真をアップロードしてデータベース (mysql) に保存します (愚か者向け) (I)
  • 画像の保存と閲覧の例 (Linux+Apache+PHP+MySQL)
  • MYSQL ストアドプロシージャと関数の簡単な記述

<<:  Hyper-V の紹介とインストールと使用 (詳細な図解)

>>:  H5 WeChatパブリックアカウント認証を実装するための簡単な手順

推薦する

Apple 電卓の JS 実装

この記事の例では、Appleの電卓を実装するためのJSの具体的なコードを参考までに共有しています。具...

mysql5.7でbinlogを使用してデータを復元する方法

ステップ1: MySQLでbinlogが有効になっていることを確認する '%log_bin%...

JavaScriptはフォームデータの非同期送信を実装します

この記事では、フォームデータの非同期送信を実装するためのJavaScriptの具体的なコードを参考ま...

Vue プロジェクトをパッケージ化して Apache サーバーにデプロイする手順

開発環境では、vue プロジェクトは、ローカルで Express サーバーを構築することをベースにし...

JavaScriptのvar let constの違いは何ですか?

目次1. 繰り返し宣言1.1 変数1.2 しましょう1.3 定数2. 可変プロモーション2.1 変数...

MySQL 8.0 ディクショナリテーブル拡張の詳細な説明

MySQL のデータ ディクショナリは、データベースの重要なコンポーネントの 1 つです。INFOR...

Vue で計算プロパティを使用する際の知識ポイントのまとめ

計算されたプロパティ場合によっては、テンプレートにロジックを詰め込みすぎると、テンプレートが重くなり...

Web プロジェクト開発 JS 機能の手ぶれ補正とスロットリングのサンプル コード

目次安定導入手ぶれ補正シーン1(マウスの動き込み)手ぶれ補正シーン2(キーボードのキー)関数のスロッ...

CentOS8 Linux 8.0.1905 のインストール手順(図解)

現在、CentOS の最新バージョンは CentOS 8 です。次に、CentOS Linux 8....

Docker で Elasticsearch Kibana と ik Word Segender をデプロイする詳細な説明

esインストール docker pull elasticsearch:7.4.0 # -d : バッ...

CentOS7 デプロイメント Flask (Apache、mod_wsgi、Python36、venv)

1. Apacheをインストールする # yum インストール -y httpd httpd-de...

MySQL 8.0.18 のインストールと設定のグラフィックチュートリアル

学習目標: Windowsシステムを使用してMySQLデータベースをインストールする方法を学びます。...

CSS でよく発生する問題の整理 (ロゴのハッキング/コンテナの固定/画像の垂直方向の中央揃え)

1. IEブラウザモードハックロゴ1. CSSハックロゴコードをコピーコードは次のとおりです。 ie...

Vue カプセル化 TabBar コンポーネントの完全なステップ記録

目次実装のアイデア:ステップ 1: TabBar と TabBarItem のコンポーネント カプセ...

MySQL マルチテーブル結合入門チュートリアル

接続は、実際の外部キー(人工的に作成された 2 つのテーブル間の対応関係を指します。対照的に、FOR...