BLOB aus mySql in Browser darstellen

maniak666

Grünschnabel
Ich habe ein Problem:

Ich möchte gerne BLOBs aus der Datenbank direkt zum Download anbieten. Hierbei soll es egal sein, ob es sich dabei um JPG, HTML, EXE oder was auch immer für Dateien handelt.

Das Auslesen klappt problemlos. Nur das Anzeigen hapert noch etwas. Vielleicht kann mir jemand nen Tipp geben. Nachfolgend der Code, der bereits funktioniert, aber leider eine falsche Datei ausgibt, die Korrupt ist...

Code:
  String	 mime = rs.getString("mimetyp");
  	String	 name = rs.getString("name");
  	response.setContentType(mime);
  	response.setHeader("Content-Disposition","attachment; filename="+name);
  	response.setHeader("Content-Length","attachment; filename="+rs.getString("size"));
  
  	InputStream is  = rs.getBinaryStream( "content" );
  	ByteArrayOutputStream output = new ByteArrayOutputStream();
  	byte[] buff = new byte[8192];
  	int len;
  	while( 0 < (len = is.read( buff )) )
  	  output.write( buff, 0, len );
  	out.write(output.toString());
  	is.close();

Alles funktioneiert wunderbar, bis auf dass :
Code:
out.write(output.toString());
(so vermute ich zumindest) mir den Code zerhaut, sodass EXE-Dateien und verschiedenste andere Formate nicht mehr funktionieren.

Grund für die Annahme ist unteranderem folgender Ausschnitt aus (so sollte man meinen) 2 identischen jpg-Dateien.[angeschaut mit Ultraedit]

Code:
  Kaputte Datei
  1AQ"aq?2?¡±B#ÁRbr3ÑC$ðᢲS4ñÂÒcs£D%³ÃTt5U&Ó?EÅ?´¥
  
  Original
  1AQ"aq?2‘¡±B#ÁRbr3Ñ‚’C$ðᢲS4ñÂÒcsƒ“£D%³ÃTt5U&Ó”EÅ„´¥

Ausserdem bekomme ich immer einen outofMemory - Error, wenn ich Dateien, mit einigen MB anzeigen lassen möchte. Das Hochladen bis 400MB in die Datenbank klappt dank einigen Einstellungen jedoch problemlos.

Ich wäre für Hilfe sehr dankbar!
 
hast Du die Möglichkeit die Dateien (original und kaputt) in Hex-code anzuschauen?
vielleicht liefert das Hinweise.

Takidoso
 
Jup habe ich...
ich habe beide dateien mal eben als zip angehängt, vielleicht ist das noch einfacher. :)

Gruß
 

Anhänge

  • TEMP.zip
    157,2 KB · Aufrufe: 24
Hallo!

Wie wär's denn damit?
Code:
/**
 * 
 */
package de.tutorials;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Tom
 */
public class ExampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        File file = new File("e:/test2.jar");

        StringBuilder type = new StringBuilder("attachment; filename=");
        type.append(file.getName());

        response.setContentLength((int) file.length());
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", type.toString());
        OutputStream os = response.getOutputStream();

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));

        while (bis.available() > 0) {
            os.write(bis.read());
        }
        os.flush();
        bis.close();
    }
}

Datei an den Browser senden. Download Servlet.

Gruß Tom
 
Eine Sache habe ich noch.... :) beim Upload in den Blob nutze ich z.Zt. folgenden Code bekomme aber auch hier einen OutaMemoryerror hast du da auch noch nen Tipp?
Also einen, damit das Ganze mehr Daten aufnehmen kann?!

Danke Sehr!

Code:
InputStream uploadedStream = item.getInputStream();
   		String name = item.getName();
   		String test;
   		test = name.substring(name.lastIndexOf(".")+1);
   		if (test.equals(name)) test = "";
 		PreparedStatement pstmt = dbCon.prepareStatement("INSERT into media (content, size, name, mimetyp, endung) VALUES (?, '"+item.getSize()+"', '"+name+"', '"+item.getContentType()+"','"+test+"')");
   		pstmt.setBinaryStream( 1, uploadedStream, (int)item.getSize());
   		pstmt.executeUpdate();
   		pstmt.close();
 

Neue Beiträge

Zurück