So speichern Sie Bilder in MySQL

So speichern Sie Bilder in MySQL

1 Einleitung

Beim Gestalten einer Datenbank ist es unumgänglich Bilder oder Audiodateien in die Datenbank einzufügen. Generell können wir den Aufwand des direkten Einfügens in die Datenbank vermeiden, indem wir statt der Datei selbst den entsprechenden Speicherort der Bilddatei einfügen. Manchmal ist das Einfügen von Bildern in MySQL jedoch einfacher. Wie speichert man es also in MySQL?

Referenz [1] enthält ein recht anschauliches Beispiel, das allerdings auf dem grafischen MySQL-Abfragetool Query Browser basiert. Wenn Sie es nicht auf Ihrem Rechner installiert haben, ist es für Sie möglicherweise nicht leicht verständlich. Ich werde hier nicht ins Detail gehen. Ausführlichere Informationen finden Sie unter dem angegebenen Link.

Darüber hinaus veranschaulicht das Beispiel in [1] lediglich die Benutzerfreundlichkeit und Leistungsfähigkeit des Query Browsers, hat aber für unsere Entwicklung keinen großen praktischen Nutzen. Verwenden wir also JAVA, um ein einfaches Beispiel für die Datenspeicherung in MySQL zu schreiben.

2 Erstellen Sie eine Tabelle

Zuerst müssen Sie eine Tabelle in der Datenbank erstellen. Ich habe eine Tabelle namens „Pic“ in einer Datenbank namens „Test“ erstellt. Die Tabelle enthält drei Spalten: IDpic, Beschriftung und Bild. Dabei ist „idpic“ der Primärschlüssel, „caption“ die Beschreibung des Bildes und „img“ die Bilddatei selbst. Die SQL-Anweisung zum Erstellen der Tabelle lautet wie folgt:

Tabelle löschen, wenn `test`.`pic` vorhanden ist;
TABELLE `test`.`pic` erstellen (
 `idpic` int(11) NICHT NULL auto_increment,
 `caption` varchar(45) NICHT NULL Standard '',
 `img` longblob NICHT NULL,
 PRIMÄRSCHLÜSSEL (`idpic`)
)ENGINE=InnoDB STANDARD-CHARSET=utf8;

Geben Sie die obige Anweisung in die Befehlszeile ein (wenn der Query Browser installiert ist, können Sie zum Erstellen der Tabelle den Anweisungen in Referenz [1] folgen, was bequemer ist.), führen Sie sie aus und die Tabelle wird erfolgreich erstellt.

3 Implementieren der Bildspeicherklasse

Nachdem die Tabelle fertig ist, beginnen wir mit dem Schreiben einer Java-Klasse, um den Vorgang des Einfügens von Bildern in die Datenbank abzuschließen. Wir wissen, dass Java- und Datenbankverbindungen über JDBC-Treiber hergestellt werden. Ich verwende MySQL Connector/J von der MySQL-Website. Wenn Sie einen anderen Treibertyp verwenden, kann es in der folgenden Implementierung zu geringfügigen Abweichungen kommen.

3.1 JDBC-Treiber laden und Verbindung herstellen

Die im JDK bereitgestellte DriverManager-Schnittstelle wird verwendet, um die Verbindung zwischen Java-Anwendung und JDBC-Treiber zu verwalten. Bevor diese Schnittstelle verwendet wird, muss DriverManager den JDBC-Treiber kennen, mit dem eine Verbindung hergestellt werden soll. Am einfachsten ist es, mit Class.forName() die Schnittstellenklasse zu registrieren, die java.sql.Driver bei DriverManager implementiert. Für MySQL Connector/J lautet der Klassenname com.mysql.jdbc.Driver.

Das folgende einfache Beispiel zeigt, wie der Connector/J-Treiber registriert wird.

importiere java.sql.Connection;
importiere java.sql.DriverManager;
importiere java.sql.SQLException;
 
öffentliche Klasse LoadDriver {
  öffentliche statische void main(String[] args) {
    versuchen {
      // Der Aufruf von newInstance() ist ein Workaround für einige
      // defekte Java-Implementierungen
      Klasse.fürName("com.mysql.jdbc.Driver").neueInstanz();
      
      // Verbindung con = DriverManager.getConnection(……)
      // ...
    } Fang (Ausnahme ex) {
      // den Fehler behandeln
    }
}

Nachdem wir den Treiber bei DriverManager registriert haben, können wir die Verbindung zur Datenbank herstellen, indem wir die Methode DriverManager.getConnection() aufrufen. Tatsächlich ist diese Anweisung im obigen Beispiel vorhanden, sie ist jedoch auskommentiert. In der folgenden Implementierung finden Sie ein vollständiges Beispiel.

3.2 Vorbereitete Anweisung

Nachdem wir die obigen Schritte abgeschlossen haben, können wir über die hergestellte Verbindung eine Statement-Schnittstellenklasse erstellen, um einige SQL-Anweisungen auszuführen. Im folgenden Beispiel verwende ich PreparedStatement und CallableStatement, die einige gespeicherte Prozeduren und Funktionen ausführen können, auf die ich hier aber nicht näher eingehen werde. Der folgende Codeausschnitt fügt einen Datensatz in die Bildtabelle ein. Dabei erhält (1) das Objekt con der Schnittstelle Connection die vorkompilierte SQL-Anweisung durch Aufruf der Methode prepareStatement, (2) weist dem ersten Fragezeichen der Insert-Anweisung einen Wert zu, (3) weist dem zweiten einen Wert zu und (4) weist dem dritten einen Wert zu. Dieser Schritt ist auch der bemerkenswerteste. Die verwendete Methode ist setBinaryStream(). Der erste Parameter 3 bezieht sich auf das dritte Fragezeichen, fis ist ein binärer Dateistream und der dritte Parameter ist die Länge des Dateistreams.

Vorbereitete Anweisung ps;
…
ps = con.prepareStatement("in PIC-Werte einfügen (?,?,?)"); // (1)
ps.setInt(1, id); //(2)
ps.setString(2, datei.getName()); (3)
ps.setBinaryStream(3, fis, (int)Dateilänge()); (4)
ps.executeUpdate();
…

3.3 Vollständiger Code

Der vollständige Code ist oben aufgeführt.

Paket com.forrest.storepic;
 importiere java.io.File;
importiere java.io.FileInputStream;
importiere java.sql.Connection;
importiere java.sql.DriverManager;
importiere java.sql.PreparedStatement;
importiere java.sql.ResultSet;
importiere java.sql.SQLException;
 
/**
 * Diese Klasse beschreibt, wie Bilddateien in MySQL gespeichert werden.
 * @Autor Yanjiang Qian
 * @version 1.0 02. Januar 2006
 */
öffentliche Klasse StorePictures {
  
  privater String dbDriver;
  privater String dbURL;
  privater String dbUser;
  privater String dbPassword;
  private Verbindung con;
  privates PreparedStatement ps; 
 
  öffentliche StorePictures() {
    dbDriver = "com.mysql.jdbc.Driver";
    dbURL = "jdbc:mysql://localhost:3306/test";
    dbUser = "root";
    dbPassword = "Administrator";
    initDB();
  }
  
  öffentliche StorePictures(String strDriver, String strURL,
      String strUser, String strPwd) {
    dbDriver = strDriver;
    dbURL = strURL;
    dbUser = strUser;
    dbPassword = strPwd;
    initDB();
  }
 
  öffentliche Leere initDB() {
    versuchen {
      // Treiber laden
      Klasse.fürName(dbDriver).newInstance();
      // Verbindung herstellen
      con = DriverManager.getConnection(dbURL,
          dbBenutzer, dbPasswort);      
    } Fang(ClassNotFoundException e) {
      System.out.println(e.getMessage());
    } Fang(SQLException Beispiel) {
      // Behandeln Sie alle Fehler
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("Lieferantenfehler: " + ex.getErrorCode());
 
    } Fang (Ausnahme e) {
      System.out.println(e.getMessage());
    }
  }
 
  öffentliches boolean storeImg(String strFile) löst Exception aus {
    Boolescher Wert geschrieben = false;
    wenn (con == null)
      geschrieben = falsch;
    anders {
      Int-ID = 0;
      Datei Datei = neue Datei (strFile);
      FileInputStream fis = neuer FileInputStream(Datei);
      
      versuchen {       
        ps = con.prepareStatement("SELECT MAX(idpic) FROM PIC");
        Ergebnismenge rs = ps.executeQuery();
        
        if(rs != null) {
          während(rs.next()) {
            id = rs.getInt(1)+1;
          }
        } anders {    
          Rücksendung schriftlich;
        }
        
        ps = con.prepareStatement("einfügen "
            + "in PIC-Werte (?,?,?)");
        ps.setInt(1, id);
        ps.setString(2, file.getName());
        ps.setBinaryStream(3, fis, (int) Datei.Länge());
        ps.executeUpdate();
        
        geschrieben = wahr;
      } Fang (SQLException e) {
        geschrieben = falsch;
        System.out.println("SQLException: "
            + e.getMessage());
        System.out.println("SQLState: "
            + e.getSQLState());
        System.out.println("Lieferantenfehler: "
            + e.getErrorCode());
        e.printStackTrace();
      Endlich       
        ps.schließen();
        fis.schließen();
        // db con schließen
        con.schließen();
      }
    }
    Rücksendung schriftlich;
  }
  
  /**
   * Startpunkt des Programms
   * @param args CMD-Zeile
   */
  öffentliche statische void main(String[] args) {
    wenn(args.length != 1) {
      System.err.println("java StorePictures Dateiname");
      System.exit(1);
    }
    Boolesche Flagge = falsch;
    StorePictures sp = neue StorePictures();
    versuchen {
      Flag = sp.storeImg(args[0]);
    } Fang (Ausnahme e) {
      e.printStackTrace();
    }
    wenn(Flagge) {
      System.out.println("Bild-Upload erfolgreich.");
    } anders {
      System.out.println("Das Hochladen des Bildes ist fehlgeschlagen.");
    }
  }
}

4 Fazit

An dieser Stelle haben wir den gesamten Prozess des Speicherns von Bildern in MySQL vorgestellt. Dieses Beispiel ist das einfachste. Leser können je nach Bedarf weitere Funktionen hinzufügen, z. B. Dateien lesen, löschen usw., um das gesamte Programm zu perfektionieren. Beim Schreiben dieses Artikels habe ich mich hauptsächlich auf die Referenz [2] bezogen, für die ich an dieser Stelle danken möchte. Referenz [3] ist ein sehr schönes Beispiel, das nicht nur das Speichern, sondern auch das Lesen ermöglicht und eine sehr intuitive grafische Oberfläche hat. Wer interessiert ist, kann es eingehend studieren.

Oben ist die Methode zum Speichern von Bildern in MySQL, die ich Ihnen vorgestellt habe. Ich hoffe, sie wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • So speichern Sie Text und Bilder in MySQL
  • Beispiel für die Verwendung von PHP zum Bedienen von BLOB-Feldern in MySQL [Speichern von Text und Bildern]
  • Express realisiert Front-End- und Back-End-Kommunikation, um Bilder hochzuladen und sie für Narren in einer Datenbank (MySQL) zu speichern (Teil 2).
  • Express realisiert Front-End- und Back-End-Kommunikation, um Bilder hochzuladen und sie für Narren in einer Datenbank (MySQL) zu speichern (I)
  • Ein Beispiel für die Speicherung und das Durchsuchen von Bildern (Linux+Apache+PHP+MySQL)
  • Einfaches Schreiben von gespeicherten MySQL-Prozeduren und -Funktionen

<<:  Einführung, Installation und Verwendung von Hyper-V (detaillierte Abbildungen)

>>:  Einfache Schritte zur Implementierung der Autorisierung eines öffentlichen H5 WeChat-Kontos

Artikel empfehlen

Ausführliche Erläuterung des globalen Status des WeChat-Applets

Vorwort Im WeChat-Applet können Sie globalData vo...

Detaillierte Erklärung der Definition und Funktion von Trennzeichen in MySQL

Wenn Sie MySQL zum ersten Mal lernen, verstehen S...

So verwenden Sie GeoIP, um Regionen in Nginx einzuschränken

Dieser Blog ist eine Arbeitsnotiz Umfeld: Nginx-V...

Automatische Dateisynchronisierung zwischen zwei Linux-Servern

Wenn Server B (172.17.166.11) eingeschaltet oder ...

Beispiele und Vergleich von 3 Methoden zur Deduplizierung von JS-Objekt-Arrays

Inhaltsverzeichnis 1. Vergleich der Daten vor und...

Lösen Sie das Problem des unzureichenden Docker-Festplattenspeichers

Nachdem der Server, auf dem sich Docker befindet,...

So erstellen Sie ein Docker-Repository mit Nexus

Das mit dem offiziellen Docker-Register erstellte...

So wählen und verwenden Sie PNG, JPG und GIF als Web-Bildformate

Welches dieser Formate (GIF, PNG oder JPG) sollte...

Implementierung des Tomcat-Bereitstellungsprojekts und Integration mit IDEA

Inhaltsverzeichnis 3 Möglichkeiten zum Bereitstel...

Detaillierte Erklärung der Lösung zur Bildverformung unter Flex-Layout

Flex-Layout ist heutzutage eine häufig verwendete...

Kompatibilitätsprobleme mit CSS3-Farbverlaufshintergründen

Wenn wir eine Hintergrundfarbe mit Farbverlauf er...

Lösung für den Fehler 2059 beim Verbinden von Navicat mit MySQL

Als ich kürzlich Django lernte, musste ich eine D...