# Filedownload scheitert



## guest (15. Jan 2008)

So ich sitze jetzt bestimmt schon 3-4h an diesem Problem... 

Ich möchte Dateien von einem Servlet aus an den Browser des Clients versenden, dieser versteht allerdings nicht, dass ich ihm die Dateien im dezimalen Format übertrage.
Falls ich Versuche die Datei als einzelne char-Zeichen zu übertragen, so kann ich zwar Textdateien versenden, allerdings gibt es bei jpg Probleme.

Hier mal der Quellcode: 


```
res.setHeader("Content-disposition", "attachment; filename="+req.getParameter("name"));
		
		FileReader down = new FileReader(new File(configs.getPath() +
				state.getPath() + req.getParameter("name")));

		ServletOutputStream sos = res.getOutputStream();

		int temp;
		while ((temp = down.read()) != -1) {
			sos.print(temp);
		}
		sos.close();
```

Ich hoffe mir kann jemand helfen.


----------



## maki (15. Jan 2008)

Was soll denn ein "Dezimales Format" sein?

Wie wär's mit Base64?


----------



## lhein (15. Jan 2008)

Hi,

ich hab zu dem Thema mal ein Tutorial geschrieben:

Tutorial

Sieh Dir insbesondere mal die Methode sendOut() in der fertigen Class an. Denke da kannst Du ablesen, wie man das am besten macht.

Grüße
lr


----------



## guest (15. Jan 2008)

6810510111532105115116321091011051101011143277101105110117110103321109799104321011051103210010112210510997108101115327011111410997116464646

Übersetzung:
Dies ist meiner Meinung nach ein dezimales Format...



Im prinzip ist das also ASCII nur als Zahl übertragen.

@ LR

Ich sehe zwar einen Unterschied, allerdings ist es doch vom Prinzip her das gleiche oder etwa nicht? Jedenfalls klappt es bei mir noch immer nicht... irgendwie bin ich gerade ein bisschen verwirrt.


----------



## lhein (15. Jan 2008)

Nein, ist es nicht.


```
FileDataSource fds = new FileDataSource(f);
        StreamDataSource sds = new StreamDataSource(fds.getInputStream(), fds.getContentType());
        DataHandler dhsds = new DataHandler(sds);

        response.setHeader("content-disposition", "attachment; filename=\"" + key + "\"");
        response.setContentType(fds.getContentType());
        response.setContentLength((int)f.length());
        try
        {
            ServletOutputStream sos = response.getOutputStream();
            dhsds.writeTo(sos);
            response.setStatus(HttpServletResponse.SC_OK);
        }
        catch (Exception e)
        {
            logger.log(Level.WARNING, "Exception occurred" + e.getMessage(), e);
        }
```

Man beachte, daß:

1. ich die Content-Length setze
2. ich den Content Type setze
3. ich eine StreamDataSource und zugehörigen DataHandler benutze
4. ich KEIN sos.print nehme
5. ich nicht byteweise lese und sende
6. ich den response status zum schluss setze
...

lr


----------



## maki (15. Jan 2008)

> Übersetzung:
> Dies ist meiner Meinung nach ein dezimales Format...


Nö, das ist nur eine Dezimale Darstellung von Zahlen, Computer rechnen normlerweise im Dualsystem.



> Im prinzip ist das also ASCII nur als Zahl übertragen.


Das Prinzip ist hier falsch angebracht, dein FileReader mag nur character und liest auch nur die richtig ein, dein ServletOutputStream kann auch Binäre Daten verschicken.

Daher auch deine Probleme mit nicht zeichenbasierten Daten wie Bildern.

Versuche es mal mit dem FileInputStream.


----------



## Guest (15. Jan 2008)

maki hat gesagt.:
			
		

> > Übersetzung:
> > Dies ist meiner Meinung nach ein dezimales Format...
> 
> 
> Nö, das ist nur eine Dezimale Darstellung von Zahlen, Computer rechnen normlerweise im Dualsystem.



He, stimmt falsche wortwahl meinerseits...



			
				maki hat gesagt.:
			
		

> Das Prinzip ist hier falsch angebracht, dein FileReader mag nur character und liest auch nur die richtig ein, dein ServletOutputStream kann auch Binäre Daten verschicken.
> 
> Daher auch deine Probleme mit nicht zeichenbasierten Daten wie Bildern.
> 
> Versuche es mal mit dem FileInputStream.



OK, danke jetzt funktionierts...


```
res.setHeader("Content-disposition", "attachment; filename="+req.getParameter("name"));
		
		FileInputStream down = new FileInputStream(new File(configs.getPath() +
				state.getPath() + req.getParameter("name")));

		ServletOutputStream sos = res.getOutputStream();

		int temp;
		while ((temp = down.read()) != -1) {
			sos.print((char)temp);
		}
		sos.close();
```

Nur noch mal rein der interesse halber.  :### 
Den FileInputStream muss ich jetzt in ein char konvertieren, da der ServletOutputStream die ankommenden ints sonst als String ansehen würde oder?


----------



## lhein (15. Jan 2008)

Willst Du es nicht verstehen, oder kannst Du es nicht? Also genauer als ich es Dir schon hingeschrieben habe, werd ich es nicht ausführen. 

lr


----------



## Leroy42 (15. Jan 2008)

Anonymous hat gesagt.:
			
		

> Den FileInputStream muss ich jetzt in ein char konvertieren



Man kann keinen _FileInputStream_ in ein _char_ konvertieren!  ???:L


----------



## Guest (15. Jan 2008)

Leroy42 hat gesagt.:
			
		

> Anonymous hat gesagt.:
> 
> 
> 
> ...



Denn muss ich es hier wohl immer ganz genau nehmen... ich meinte natürlich die Daten die vom FileInputStream kommen... achja um genau zu sein... sind es die einzelnen ints die von der Methode FileInputStream.read() kommen.

Ach ja @lr 

ich dachte es ist doch nicht das gleiche was ich mache und was du machst, von daher kann ich wohl nicht davon ausgehen das du meine Frage beantwortet hast....
Außerdem ist die Antwort darauf bestimmt noch kürzer als der Text den du eben geschrieben hast....


----------



## lhein (15. Jan 2008)

@Gast:
Das sagt mir dann auch schon, wie gründlich Du das Tutorial und meinen geposteten Code gelesen und verstanden hast.
Der gepostete Codeabschnitt macht genau das, was Du willst. 
Das Tutorial macht nicht genau das was Du willst. 
Damit wären Unterschiede und Gemeinsamkeiten geklärt.

Ansonsten kann ich Dir nur mal ans Herz legen, daß Du es mal ausprobierst, was ich Dir vorschlage.

lr


----------



## Gast (15. Jan 2008)

Es hätte nicht wirklich gelohnt deine Beispiele auszuprobieren, denn ich habe die Klasse StreamDataSource bspw. nicht.
Das diese im Package org.apache.servicemix.jbi.util.* liegt ist mir bekannt... allerdings bekomme ich hier auch keinerlei Dateien aus dem Internet auf meinem Rechner... von daher sehe ich das als berechtigt an... da alle deine Codeauszüge sich darauf beziehen muss ich ja wohl ein bisschen genauer nachfragen, um zumindest irgendwie den gewünschten Effekt erzielen zu können.

Naja sehen wir das Thema einfach als abgeschlossen an, denn es funktioniert ja alles so wie es soll.


----------



## lhein (15. Jan 2008)

Da hast Du recht. Aber prinzipiel solltest Du die StreamDataSource auch weglassen können. DataHandler und FileDataSource würden sicher auch reichen, das ganze umzusetzen. Diese sind Bestandteil des  JAF (Java Beans Activation Framework)

Der Unterschied der daraus resultiert ist, dass das Befüllen des ServletOutputStreams etwas anders geht.

lr


----------

