자바리안
198
2017-01-08 23:59:25
1
2132

모바일 웹에서 파일다운로드 질문입니다.


안녕하십니까. java, jsp 개발자입니다.

경력이 오래되었어도 경험과 구글링 실력이 없으면 막히는게 참 많습니다.

그래서 여러 개발자님들께 조언을 얻고자 이렇게 글을 올립니다.

모바일 웹. 정확히 말하자면 반응형 웹을 개발하고 있습니다.

하지만 대부분 모바일에서 사용을 하게 될 것 같습니다.

현재 막히는 부분은 파일 다운로드 입니다.

java servlet 방식으로 구현을 해놨습니다.

jsp 쪽에

<form id="fileDownloadForm" action="" method="post" target="util-frame">

<input type="hidden" name="file_path" id="file_path" />

<input type="hidden" name="file_name" id="file_name" />

<input type="hidden" name="sys_file_name" id="sys_file_name" />

</form>

과 같이 하고 controller 호출합니다.

controller 에서는

String filePath = request.getParameter("file_path");

String fileName = request.getParameter("file_name");

String sysFileName = request.getParameter("sys_file_name");

HashMap<String, Object> fileMap = new HashMap<String, Object>();

fileMap.put("file_path", filePath);

fileMap.put("file_name", fileName);

fileMap.put("sys_file_name", sysFileName);

FileUtils.downloadProcess(fileMap, request, response);


호출을 하면 FileUtils에서 

String contextPath = request.getSession().getServletContext().getRealPath("/").replace("//", "/").replace("\\", "/");

contextPath = contextPath.substring(0, contextPath.length()-1);

String filePath = (String)fileMap.get("file_path");

String fileName = (String)fileMap.get("file_name");

String sysFileName = (String)fileMap.get("sys_file_name");


File file = new File(contextPath + filePath + "/" + sysFileName);

String targetName = fileName;


long fileSize = file.length();

String mimeType = request.getSession().getServletContext().getMimeType(file.getName());

if (mimeType == null || mimeType.length() == 0) {

mimeType = "application/octet-stream;";

}


byte[] buffer = new byte[BUFFER_SIZE];


response.setContentType(mimeType + "; charset=" + CHARSET);


String userAgent = request.getHeader("User-Agent");

if (userAgent.indexOf("MSIE 5.5") > -1) { // MS IE 5.5 이하

response.setHeader("Content-Disposition",

"filename=" + URLEncoder.encode(targetName, "UTF-8").replaceAll("\\+", "\\ ") + ";");

} else if (userAgent.indexOf("MSIE") > -1) { // MS IE (보통은 6.x 이상 가정)

response.setHeader("Content-Disposition", "attachment; filename="

+ java.net.URLEncoder.encode(targetName, "UTF-8").replaceAll("\\+", "\\ ") + ";");

} else if (userAgent.indexOf("Trident") > -1) { // MS IE 11

response.setHeader("Content-Disposition", "attachment; filename="

+ java.net.URLEncoder.encode(targetName, "UTF-8").replaceAll("\\+", "\\ ") + ";");

} else { // 모질라나 오페라

response.setHeader("Content-Disposition", "attachment; filename="

+ new String(targetName.getBytes(CHARSET), "latin1").replaceAll("\\+", "\\ ") + ";");

}

// 파일 사이즈가 정확하지 않을때는 아예 지정하지 않는다.

if (fileSize > 0) {

response.setHeader("Content-Length", "" + fileSize);

}


BufferedInputStream fin = null;

BufferedOutputStream outs = null;


try {

fin = new BufferedInputStream(new FileInputStream(file));

outs = new BufferedOutputStream(response.getOutputStream());

int read = 0;


while ((read = fin.read(buffer)) != -1) {

outs.write(buffer, 0, read);

}

} catch (IOException ex) {

// Tomcat ClientAbortException을 잡아서 무시하도록 처리해주는게 좋다.

} finally {

try {

outs.close();

} catch (Exception ex1) {

}


try {

fin.close();

} catch (Exception ex2) {

}

} // end of try/catch

와 같이 처리를 합니다.


현재 PC 에서는 IE11, 크롬에서 정상적으로 되고 안드로이드 폰에서도 인터넷 브라우저와 크롬브라우저에서는 정상적으로 다운받아집니다.

근데 안드로이드 네이버 앱에서 해당 모바일웹 주소로 접속하여 다운로드를 하면 반응이 없습니다.

iOS 에서도 반응이 없구요. 서버로 통신이 들어와 로그까지는 찍히지만 다운로드가 됐다거나 어떤 뷰어로 열린다거나 하지를 않습니다.


모바일웹에서 파일 다운로드를 처음 구현해봐서 여러가지 막히는 부분이 많습니다. 경험 많으신 여러 개발자님들께 도움을 받고 싶습니다. 부탁드립니다. 

0
0
  • 답변 1

  • 마플스
    2
    2019-07-03 14:33:03

    저도 같은 내용으로 찾고있는데요,,, 혹시 해결하셨는지요?

    공유 부탁드려요ㅜㅜ

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.