Java EE - Bild in Datenbank hochladen? - Java, Datenbank, Upload, Blob

Ich mache eine ziemlich einfache Seite für meine Mutter, und da ich im letzten Semester einige Sachen in Java EE und mit EJB gemacht habe, bleibe ich dabei.

Das einzige Problem, das ich habe, ist das Hochladen von Bildern - ich kann anscheinend keine Beispiele finden.

Ich verwende Entity-Klassen und parametrisierte Abfragen. Dies ist der Code für das Schreiben in die Datenbank, die gut funktioniert, ich setze nur den Blob-Image-Wert auf Null für den Moment.

@Override
public void addClothes(String designer, String cname, String ctype, String desc) {
Clothes c = new Clothes();
em.persist(c);
c.setDesigner(designer);
c.setCname(cname);
c.setCtype(ctype);
c.setDescript(desc);
c.setImage(null);
}

Ich habe ein Servlet, das eine Datei nimmt, ich bin einfach nicht sicher, wie die Datei, wenn sie übergeben wird, sortiert werden soll und was ich in die Datenbank schreiben soll (von dem was ich sehe, es ist Byte [])

Eine Hand in die richtige Richtung wäre willkommen!

Antworten:

1 für die Antwort № 1

Sobald Sie die Datei auf dem Server haben, entweder im Speicher oder in einer lokalen oder temporären Datei (das hängt von dem Framework oder den Bibliotheken ab, die Sie verwenden), haben Sie einen Verweis auf einen Wrapper-Typ.

Wenn Sie verwenden Apache Commons Datei hochladen, du hast ein FileItem Referenz. Zur Abfrage aller Inhalte der Datei als Byte-Array:

byte[] contents = fileItem.get();

Wenn Sie verwenden Tomahawk von Trinidad, du hast ein org.apache.myfaces.trinidad.model.UploadedFile Referenz. Um den gesamten Inhalt der Datei als Byte-Array anzufordern, können Sie die Klasse verwenden IOUtils des Apache Commons IO:

byte[] contents = IOUtils.toByteArray(uploadedFile.getInputStream());

Wenn Sie eine Referenz von haben org.apache.myfaces.custom.fileupload.UploadedFile, ist einfacher:

byte[] contents = uploadedFile.getBytes();

AKTUALISIEREN

Wenn Sie Java EE 6 verwenden, können Sie neue Features der Server 3.0-Spezifikation für das Hochladen von Dateien ohne zusätzliche Bibliotheken verwenden. Sehen Sie das ausgezeichnete Tutorium von BalusC in Der BalusC-Code: Hochladen von Dateien in Servlet 3.0


0 für die Antwort № 2

Um mit Ruhezustand zu arbeitenhttp://www.mkyong.com/hibernate/hibernate-save-image-into-database/

Um mit JDBC zu arbeiten:

Um Bild in Datenbank BLOB mit Jdbc zu schreiben,Sie müssen die Datei in Inputstream konvertieren. statement.setBinaryStream (2, (InputStream) inputStream, (int) (image.length ())); PreparedStatement-Anweisungsangebots-Methode setBinaryStream (), die verwendet wird, um einen binären Datenstrom in die Datenbank-BLOB-Spalte zu schreiben.

Hier ist ein Code-Snippet, um Ihnen zu helfen:

File image = new File("C:/test.jpg");
inputStream = new FileInputStream(image);

Prepared statement = //define as per your table
// set the file binary stream
statement.setBinaryStream(2, (InputStream) inputStream,(int) (image.length()));

statement.executeUpdate();

0 für die Antwort № 3

In Ihrer Kleidung-Klasse können Sie hinzufügen:

@Lob
private byte[] image;

// Getter/Setter methods

0 für die Antwort № 4

Habe es funktioniert! Etwas, mit diesem Code:

public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
out = response.getWriter();
final String path = "clothesImages" + File.separator + request.getParameter("designer") + File.separator + request.getParameter("ctype") + File.separator + request.getParameter("cname");
out.println(path);
String currentDir = new File(".").getAbsolutePath();
out.println(currentDir);
final Part filePart = request.getPart("image");
final String filename = "image.jpg";
File file = new File(path);
if (!file.exists()){
out.println("Dir Doesn"t Exist");
file.mkdirs();
}
OutputStream outstream = null;
InputStream filestream = null;

try{
outstream = new FileOutputStream(new File(path + File.separator + filename));
filestream = filePart.getInputStream();
int read = 0;
final byte[] bytes = new byte[1024];
while(( read = filestream.read(bytes)) != -1){
outstream.write(bytes, 0, read);
}
out.println("New file " + filename + " created at " + path);
}catch (FileNotFoundException fne) {
out.println("You either did not specify a file to upload or are "
+ "trying to upload a file to a protected or nonexistent "
+ "location.");
out.println("<br/> ERROR: " + fne.getMessage());
}finally {
if (out != null) {
out.close();
}
if (filestream != null) {
filestream.close();
}
if (outstream != null) {
outstream.close();
}
}

}

Das einzige Problem, das ich habe, ist den Dateipfad zu setzen. Der Weg ist

C: UsersChrisAppDataRoamingNetBeans7.2.1configGF3domain1

Aber ich möchte es speichern

Projekt-Krieg / Web / Bilder

Irgendwelche Ideen?


Verwandte Fragen
Speisekarte