コード例 #1
0
  @Override
  public void service(HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException {

    String pathInfo = request.getPathInfo();

    try {
      // download.html
      if (pathInfo != null && pathInfo.startsWith("/download.html")) {
        // sending an HTML page helps debugging on IE, which often blocks or
        // otherwise fails to download directly
        String id = request.getParameter(ID_REQUEST_PARAM);
        String filename = request.getParameter("filename");
        String linkTarget =
            "../download/"
                + (filename != null ? filename : "polymap3_export.tmp")
                + "?"
                + ID_REQUEST_PARAM
                + "="
                + id;

        response.setContentType("text/html; charset=ISO-8859-1");

        PrintWriter out = response.getWriter();
        out.println("<html><head>");
        out.println("<meta HTTP-EQUIV=\"REFRESH\" content=\"0; url=" + linkTarget + "\">");
        out.println("</head>");
        out.println("<a href=\"" + linkTarget + "\">Download starten</a>");
        out.println("</html>");
        out.flush();
      }

      // download
      else {
        String id = request.getParameter(ID_REQUEST_PARAM);
        log.info("Request: id=" + id);
        if (id == null) {
          log.warn("No 'id' param in request.");
          response.sendError(404);
          return;
        }

        ContentProvider provider = providers.get(id);
        if (provider == null) {
          log.warn("No content provider registered for id: " + id);
          response.sendError(404);
          return;
        }

        // String[] pathInfos = StringUtils.split( request.getPathInfo(), "/" );

        String contentType = provider.getContentType();
        response.setContentType(contentType);
        // display any HTML content in browser instead of downloading it
        if (contentType != null && !contentType.toLowerCase().contains("html")) {
          response.setHeader(
              "Content-disposition", "attachment; filename=" + provider.getFilename());
        }
        response.setHeader("Pragma", "public");
        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Cache-Control", "public");
        response.setHeader("Expires", "0");

        InputStream in = provider.getInputStream();
        ServletOutputStream out = response.getOutputStream();
        boolean providerDone = false;
        try {
          IOUtils.copy(in, out);
          out.flush();
          response.flushBuffer();

          providerDone = provider.done(true);
        } catch (Exception e) {
          providerDone = provider.done(false);
        } finally {
          IOUtils.closeQuietly(in);
        }

        if (providerDone) {
          providers.remove(id);
        }
      }
    } catch (Exception e) {
      log.debug("", e);
      throw new ServletException(e);
    }
  }