tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
11121
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Weils desöfteren angefragt wird hier mal ein Beispiel wie man Dateien zum Client Streamen kann:

    Hier sollte man die getFileToDownload() Methode entsprechend implementieren (Gegebenenfalls noch weitere Parameter hineinreichen etc...)

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    package de.tutorials;
     
     import java.io.File;
     import java.io.FileInputStream;
     import java.io.FileNotFoundException;
     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;
     
     /**
      * Servlet Class
      * 
      * @web.servlet name="downloadServlet" display-name="Simple DownloadServlet"
      *           description="Simple Servlet for Streaming Files to the Clients
      *           Browser"
      * @web.servlet-mapping url-pattern="/download"
      */
     public class DownloadServlet extends HttpServlet {
        static final int BUFFER_SIZE = 16384;
     
        protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
            File file = getFileToDownload();
            prepareResponseFor(response, file);
            streamFileTo(response, file);
        }
     
        private File getFileToDownload() {
            return new File("c:/foo.jar");
        }
     
        private void streamFileTo(HttpServletResponse response, File file)
                throws IOException, FileNotFoundException {
            OutputStream os = response.getOutputStream();
            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = 0;
            while ((bytesRead = fis.read(buffer)) > 0) {
                os.write(buffer, 0, bytesRead);
            }
            os.flush();
            fis.close();
        }
     
        private void prepareResponseFor(HttpServletResponse response, File file) {
            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());
        }
     }

    Elemente der web.xml:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
         <servlet>
         <description><![CDATA[Simple Servlet for Streaming Files to the Clients Browser]]></description>
          <display-name>Simple DownloadServlet</display-name>
          <servlet-name>downloadServlet</servlet-name>
          <servlet-class>de.tutorials.DownloadServlet</servlet-class>
         </servlet>
      
         <servlet-mapping>
          <servlet-name>downloadServlet</servlet-name>
          <url-pattern>/download</url-pattern>
         </servlet-mapping>

    Aufrufen kann man das ganze (beispielsweise) über:
    http://localhost:8080/DER_NAME_DEINER_WEB_APP/download

    Gruss Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  2. #2
    xrax xrax ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    133
    Hallo Thomas,

    ich habe den Code bei mir getested und es funktioniert fast wie gewünscht.

    Das Problem kann aber auch bei meinem Client liegen. Ich nutze keine .jsp sonder lege die angeforderte Datei direkt beim client ab.

    Hier ist mein Clientcode:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    byte[] buffer = new byte[18000];
                int read = 0;
     
                DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
                FileOutputStream out = new FileOutputStream("C:\\DEV\\abc.xml");
                while(true) {
                    read = dis.read(buffer);
                    if (read == -1) {
                        break;
                    }
                    out.write(buffer, 0, read);
                }
    So erhalte ich aber immer noch ein paar Headerdaten. Das erzeugte file wäre dann so:

    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Disposition: attachment; filename=XML_test.xml
    Content-Type: application/octet-stream
    Content-Length: 1494
    Date: Mon, 05 May 2008 13:55:36 GMT
    Connection: keep-alive

    <?xml version="1.0" encoding="UTF-8"?><SSWpacket xmlns:xsi="http://www.w3.org/2001.........................
    oder wenn ich prepareRespnseFor() weglasse:
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Date: Mon, 05 May 2008 14:05:49 GMT
    Connection: close

    <?xml......
    Wie kann ich verhindern das die Headerdaten mitgesendet werden? das ursprungsfile beginnt mit <?xml......

    Hat jemand einen Tip?

    Besten Dank
    xrax
    Geändert von xrax (05.05.08 um 16:08 Uhr)
     

Ähnliche Themen

  1. Beispiel für einfaches Testen von JavaScript + Codeabdeckung.
    Von Konstantin Denerz im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 16.09.09, 14:25
  2. Fehler - einfaches RMI Beispiel funktioniert nur lokal
    Von Froebel im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 24.07.08, 08:14
  3. Einfaches Beispiel zu Remoting mit Springframework .Net
    Von Thomas Darimont im Forum .NET Café
    Antworten: 0
    Letzter Beitrag: 23.06.07, 13:57
  4. Einfaches Beispiel zu .Net Remoting
    Von Thomas Darimont im Forum .NET Web und Kommunikation
    Antworten: 0
    Letzter Beitrag: 01.03.07, 01:02
  5. [WinSocket] Ein einfaches Beispiel
    Von Tobias K. im Forum C/C++
    Antworten: 13
    Letzter Beitrag: 17.02.05, 17:23