# BLOB aus mySql in Browser darstellen



## maniak666 (18. Mai 2005)

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... 


```
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 : 
	
	
	



```
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]


```
Kaputte Datei
  1AQ"aq?2?¡±B#ÁRbr3ÑC$ðá¢²S4ñÂÒcs£D%³ÃTt5U&Ó?EÅ?´¥
  
  Original
  1AQ"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!


----------



## takidoso (18. Mai 2005)

hast Du die Möglichkeit die Dateien (original und kaputt) in Hex-code anzuschauen?
vielleicht liefert das Hinweise.

Takidoso


----------



## maniak666 (18. Mai 2005)

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

   Gruß


----------



## Thomas Darimont (18. Mai 2005)

Hallo!

Wie wär's denn damit?

```
/**
 * 
 */
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


----------



## maniak666 (18. Mai 2005)

Also ich kann nur sagen 

 biggy Thank You! Dat ! 

 Sogar nun mit großen Files!

 MErci!


----------



## maniak666 (18. Mai 2005)

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!


```
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();
```


----------

