package javacodebook.server.stream;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

/**
 *  Ein Servlet, dass eine Binärdatei an den Browser ausliefert. Der
 *  Dateiname wird als Parameter übergeben. Vorsicht: Damit werden auch
 *  eventuell sicherheitskritische Dateien ausgeliefert! Für den Produktivbetrieb
 *  muss auf jeden Fall eine Beschränkung auf erlaubte Verzeichnisse eingefügt
 *  werden.
 */
public class StreamServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        //Parameter file auswerten und überprüfen, ob Datei existiert
        String filename = request.getParameter("file");
        if(filename == null || !(new File(filename)).exists())
            return;

        //den korrekten Content-Type ermitteln
        String mimeType = getServletConfig().getServletContext().getMimeType(filename);
        response.setContentType(mimeType);

        //statt eines Writers muss ein Stream verwendet werden
        ServletOutputStream out = response.getOutputStream();
        FileInputStream in = new FileInputStream(filename);
        byte[] buffer = new byte[8192];
        int bytesRead = 0;
        while((bytesRead = in.read(buffer)) > 0)
            out.write(buffer, 0, bytesRead);

        in.close();
        out.close();
        //ganz wichtig bei sehr kleinen Dateien: response-Buffer-flush
        response.flushBuffer();
   }

}
