98..Etc/Etc...2008. 8. 19. 16:48
반응형

파일 다운로드에 관하여 여러모로 고민하다가 기본의 Struts내에서 지원하는 DownloadAction 클래스를 상속하여 Streaminfo를 받아오는 방식을 포기하고 직접 새로운 DownloadFile 메소드를 짜보았습니다. 직접 적용하여 쓰시려면 필히 DownFileException 예외클래스를 만들어주시고 MessageResource.properties속에 해당 키를 설정해주어야 합니다. 기존의 파일이 존재하지않으면(즉 파일 사이즈가 0 바이트) DownFileException을 만들어서 에러페이지로 포워딩 하는 방법을 사용하였습니다. 다양하게 스크립트를 띠우거나 다른 방식을 취하셔도 좋습니다.^^

참고로 파일 명이 깨지는 문제를 해결하기 위하여 DownloadFileAction에서 아래와 같이 미리 파일명을 처리해주었습니다.

logicalFileName = URLEncoder.encode(logicalFileName,"UTF-8");

 

 

public static void DownloadFile(HttpServletRequest request,
   HttpServletResponse response, String filePath, int maxFileSize,
   String physicalFileName, String logicalFileName) throws Exception {

  File file = new File(filePath + physicalFileName); // Realpath of
                 // file...
 
  // Primary check for whether the selected file is existed...
  if (file.length() == 0) {
   DownFileException dfe = new DownFileException();
   dfe.setMessageKey("error.board.nonexist.files.error");
   throw dfe;
  }
 
  response.setContentType("application/octet-stream");
  String Agent = request.getHeader("USER-AGENT");
  if (Agent.indexOf("MSIE") >= 0) {
   int i = Agent.indexOf('M', 2);
   String IEV = Agent.substring(i + 5, i + 8);
   if (IEV.equalsIgnoreCase("5.5")) {
    response.setHeader("Content-Disposition", "filename="
      + logicalFileName);
   } else {
    response.setHeader("Content-Disposition",
      "attachment;filename=" + logicalFileName);
   }
  } else {
   response.setHeader("Content-Disposition", "attachment;filename="
     + logicalFileName);
  }

  byte b[] = new byte[maxFileSize * 1024 * 1024];
  if (file.exists()) {
   try {
    BufferedInputStream fin = new BufferedInputStream(
      new FileInputStream(file));
    BufferedOutputStream outs = new BufferedOutputStream(response
      .getOutputStream());
    int read = 0;
    while ((read = fin.read(b)) != -1) {
     outs.write(b, 0, read);
    }
    outs.flush();
    outs.close();
    fin.close();
   } catch (Exception e) {
   }
  }
 }

Posted by 1010