Filedownload scheitert

Status
Nicht offen für weitere Antworten.
G

guest

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

Code:
                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.
 
M

maki

Gast
Was soll denn ein "Dezimales Format" sein?

Wie wär's mit Base64?
 

lhein

Top Contributor
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
 
G

guest

Gast
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

Top Contributor
Nein, ist es nicht.

Code:
        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
 
M

maki

Gast
Ü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.
 
G

Guest

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

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

Top Contributor
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
 
G

Guest

Gast
Leroy42 hat gesagt.:
Anonymous hat gesagt.:
Den FileInputStream muss ich jetzt in ein char konvertieren

Man kann keinen FileInputStream in ein char konvertieren! ???:L

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

Top Contributor
@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
 
G

Gast

Gast
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

Top Contributor
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Builden eines Web Service Projekts scheitert Allgemeines EE 6

Ähnliche Java Themen

Neue Themen


Oben