bytestream Beispiel

Das heist ich könnte auch einen string "Hello world" umwandeln in einen Bytestream und diesen Bytestream beim Download als test.txt ausgeben. Und dann würde der die Datei auf meinem Rechtner test.txt heißen und in der Datei würde" Hello world" stehen.

Ist das korrekt?
 
Ich komme leider imernoch nicht weiter vllcht kann mir jemand Helfen und sagen was ich falsch mache.
Der String wird zwar als Antwort zurückgelifert jedoch schreibt er ihn mir nicht in die Datei und öffnet auch nicht das downloadfenster vom Browser.


Code:
@Controller
public class AjaxDocumentDownloadController
{
	
	@RequestMapping(value = "/master/download", method = RequestMethod.GET)
	public void download( @RequestParam(value = "folderPath", required = true) String folderPath, HttpServletRequest request, HttpServletResponse response ) throws Exception
	{
		response.setContentType("application/pdf");
		response.setHeader("Content-Description", "File Transfer");
		response.setHeader("Content-Disposition", "attachment;filename=downloadfilename.pdf");
		StringBuffer sb = new StringBuffer("whatever string you like");
		InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
		ServletOutputStream out = response.getOutputStream();
		
		byte[] outputByte = new byte[24];
		// copy binary connect to output stream
		while (in.read(outputByte, 0, 24) != -1)
		{
			out.write(outputByte, 0, 24);
		}
		in.close();
		out.flush();
		out.close();
	}
}
 
Zuletzt bearbeitet:
Moin,

was genau ist bei Deinem Code "response" :confused:


Der String wird zwar als Antwort zurückgelifert jedoch schreibt er ihn mir nicht in die Datei und öffnet auch nicht das downloadfenster vom Browser.
Wieso "downloadfenster vom Browser" ?
Das macht doch Deine Anwendung, oder nicht ?

Code:
response.setContentType("application/pdf");
response.setHeader("Content-Description", "File Transfer");
response.setHeader("Content-Disposition", "attachment;filename=downloadfilename.pdf");

StringBuffer sb = new StringBuffer("whatever string you like");

InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
ServletOutputStream out = response.getOutputStream();
		
byte[] outputByte = new byte[24];

// copy binary connect to output stream
while (in.read(outputByte, 0, 24) != -1)
	{
		out.write(outputByte, 0, 24);
	}
		
in.close();
out.flush();
out.close();
Also gleichzeitig Lesen und Schrieben über die gleiche Variable wird sicherlich problematisch sein.
Lies am besten erst den InputStream ein und schreibe dann nach Output !

Gruß
Klaus
 
Zuletzt bearbeitet:
Moin,

ah, ok ... dann scheint das ja möglicherweise doch zu gehen.
Der einzige nennenswerte Unterschied sind wohl die Zeilen mit "setHeader".
Da Du die Funktion doppelt aufrufst, wird möglicherweise der erste Eintrag durch den zweiten überschrieben (nur so als Idee) !

Ob sich durch diesen Code das Downloadfenster öffnen sollte, kann ich Dir leider nicht sagen!

Gruß
Klaus
 
Der header sieht nach dem Aufrufen so aus:

Antwort-Header
Content-Description File Transfer
Content-Disposition attachment;filename=downloadfilename.pdf
Content-Type application/pdf
Server Jetty(6.1.26)
Transfer-Encoding chunked
 
Moin,

oh, sorry ...
klar - Description und Disposition - wer lesen kann ist klar im Vorteil!

Hast Du outputByte während der Schleife mal im Debugger beobachtet ?

Gruß
Klaus
 
So da mein Problem leider immer noch nicht gelöst ist und es langsam für mich knapp wird brauche ich dringend eure Hilfe und werde alle Sachen hier nochmal zusammenfassen.


Mein Quellcode:
Code:
@Controller
public class AjaxDocumentDownloadController
{
    
    @RequestMapping(value = "/master/download", method = RequestMethod.GET)
    public void download( @RequestParam(value = "folderPath", required = true) String folderPath, HttpServletRequest request, HttpServletResponse response ) throws Exception
    {
        response.setContentType("application/pdf");
        response.setHeader("Content-Description", "File Transfer");
        response.setHeader("Content-Disposition", "attachment;filename=downloadfilename.pdf");
        StringBuffer sb = new StringBuffer("whatever string you like");
        InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
        ServletOutputStream out = response.getOutputStream();
        
        byte[] outputByte = new byte[24];
        // copy binary connect to output stream
        while (in.read(outputByte, 0, 24) != -1)
        {
            out.write(outputByte, 0, 24);
        }
        in.close();
        out.flush();
        out.close();
    }
}


Dieser Controller wird von einem Klick auf einen Button aufgerufen und soll mir eine pdf Datei mit dem Inhalt "whatever string you like" bereitstellen.
Diese soll dann von dem Nutzer über den gewohnten Internetbrowserdownload an eine von ihme gewählte lokale Stelle auf seinem Rechner gespeichert werden.

Frage:
Ist dies wirklich der gesammte Quellcode um dies auszuführen?


Wenn ich nun auf den Button klicke gibt Firebug folegendes aus

Header:
header_firebug.png

Antwort:
antwort_firebug.png

Im Debugmodus von eclipse erscheint folgendes:

Request:
request_eclipse_debug.png

Response:
response_eclipse_debug.png

StringBuffer:
stringbuffer_eclipse_debug.png

Input:
inputstream_eclipse_debug.png

Output:
output_eclipse_debug.png

Outputbyte:
outputbyte_eclipse_debug.png

In dieser Reihenfolge.


Problem:

Der Browser ruft kein Downloadfenster auf ( Dies wo der Benutzer den Speicherort wählt).
 
Okay der Code ist richtig.

Der Fehler war das JQuery die Antwort nicht verarbeiten konnte.

Lösung:

document.location.href="url";
 

Neue Beiträge

Zurück