<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="com.innorix.transfer.InnorixCustomError"%> <%@ page import="com.innorix.transfer.InnorixDownload" %> <%@ page import="java.io.*" %> <% String saveDir = delimiterReplace(request.getRealPath(request.getServletPath())); String filePath = saveDir.substring(0, saveDir.lastIndexOf("/") + 1); /* filePath 파일이 저장된 스토리지 전체경로 디렉토리 구분은 윈도우, 유닉스 모두 "/" 문자 사용 윈도우 - C:/storage/path1/path2/data 유닉스 - /storage/path1/path2/data */ // downloadType : "stream" 설정시 자동 전달되는 GET Param 값 String szStartOffset = request.getParameter("_StartOffset"); String szEndOffset = request.getParameter("_EndOffset"); // 파일 스트림 데이터 참조용 GET Param 값, 파라메터 명은 자유 형식 String fileID = request.getParameter("fileID"); String fileName = request.getParameter("fileName"); String sysFileName = new String(); String orgFileName = new String(); if (fileID != null) { if (fileID.equals("1")) { sysFileName = "sample-file.pdf"; // 시스템 저장 파일명 orgFileName = "INNORIX WP 브로셔.pdf"; // 원본 파일명 } if (fileID.equals("2")) { // sysFileName = "sample-file.pdf"; sysFileName = "sample-file.app"; // ※ (오류) 실제 없는 파일 orgFileName = "INNORIX WP Brochure.pdf"; } if (fileID.equals("3")) { // sysFileName = "sample-file.pdf"; sysFileName = "sample-file.app"; // ※ (오류) 실제 없는 파일 orgFileName = "INNORIX WP パンフレット.pdf"; } } if (fileName != null) { sysFileName = "data/" + fileName; orgFileName = fileName; } // 파일명 깨짐대응 문자열 인코딩 처리 orgFileName = java.net.URLEncoder.encode(orgFileName, "UTF-8").replaceAll("\\+", "%20"); File file = new File(filePath + sysFileName); response.setContentType("application/octet-stream"); response.setHeader("Accept-Ranges", "bytes"); response.setHeader("Content-Disposition", "attachment; filename=\"" + orgFileName +"\""); long startOffset = 0; long endOffset = 0; if (szStartOffset != null) { startOffset = Long.parseLong(szStartOffset); } if (szEndOffset != null) { endOffset = Long.parseLong(szEndOffset); } long contentLength = 0; if(szStartOffset != null || szEndOffset != null) { // 컨트롤 다운로드 요청시 contentLength = endOffset - startOffset + 1; } else { // html 일반 다운로드 요청시 contentLength = file.length(); } byte b[] = new byte[8192]; BufferedInputStream input = null; BufferedOutputStream output = null; try { out.clear(); out=pageContext.pushBody(); input = new BufferedInputStream(new FileInputStream(file)); output = new BufferedOutputStream(response.getOutputStream()); response.setHeader("Content-Length", "" + contentLength); int read = 0; if (startOffset != 0) { long n = input.skip(startOffset); if (n == -1) read = -1; } if(contentLength > 0) { while (contentLength > 0) { if(contentLength < 8192) { b = new byte[(int)contentLength]; } read = input.read(b); if(read == -1) { break; } output.write(b, 0, read); contentLength = contentLength - read; System.out.println("========== innorix transfer " + System.currentTimeMillis() + " =========="); System.out.println("fileID \t: " + fileID); System.out.println("sysFilePath \t: " + filePath + sysFileName); System.out.println("orgFileName \t: " + java.net.URLDecoder.decode(orgFileName, "UTF-8")); System.out.println("totalLength \t: " + file.length() ); System.out.println("contentLength \t: "+contentLength); System.out.println("startOffset \t: " + startOffset); System.out.println("read \t: "+read); System.out.println("endOffset \t: " + endOffset); } } } catch(Exception e) { e.printStackTrace(); /* downloadCustomError 에러코드, 에러메시지, 에러타이틀 설정 customError.set(Error Code, Error Message, Error Title, retry); // 커스텀 에러 설정 * Error Code 설정 시 1000번대로 설정하는 것을 권장합니다. * 너무 크거나 너무 작을 경우 다른 코드들과의 충돌로 정상 작동이 되지 않을 수 있습니다. customError.run(); // 커스텀 에러 실행 */ response.setStatus(404); InnorixCustomError customError = new InnorixCustomError(response); customError.set("1004", "Download Error", "File Download Error", false); // output이 getOutputStream을 이용하고 있을 시 output을 이용해서 커스텀 에러를 전송 if (output != null){ output.write(customError.runAction().getBytes("UTF-8")); }else{ customError.run(); } } finally { if(output != null) { output.flush(); output.close(); } if(input != null) { input.close(); } } %> <%! private String delimiterReplace(String fullDir) { String ret1 = fullDir.replaceAll("\\\\+", "/"); String ret2 = ret1.replaceAll("\\/+", "/"); return ret2; } %>