Java 웹 구현 파일 다운로드 및 디코딩 처리 방법

파일 업로드와 다운로드는 웹 개발에서 자주 발생하는 문제입니다. 요 며칠 동안 프로젝트를 하면서 파일 다운로드에 사용했습니다. 그 전에도 필기를 조금씩 흩어 놓았습니다. 오늘 정리를 하겠습니다.파일 업로드는 아직 진일보한 테스트를 거쳐야 하니, 여기서 먼저 파일 다운로드를 말씀드리겠습니다.
1. 파일 다운로드 프로세스
파일 다운로드 프로세스는 다음과 같이 명확합니다.
1. 파일 이름이나 파일 경로에 따라 파일을 포지셔닝하고 구체적인 정책은 주로 자신의 수요에 따라 시스템이 찾을 수 있는 파일 전체 경로가 필요하다.
2. 입력 흐름을 가져오고 대상 파일에서 입력 흐름을 가져옵니다.
3. 출력 흐름을 가져오고response에서 출력 흐름을 가져옵니다.
4. 입력 흐름에서 파일을 읽고 출력 흐름을 통해 파일을 출력합니다.이것은 진정한 다운로드 실행 과정이다.
5. 입출력 흐름을 닫습니다.
주요 절차는 바로 이것이다. 또한 필요한 속성 설정, 예를 들어 비교적 중요한 설정 파일이 있는contentType 형식 등이다.
2. 시끄럽지 말고 코드를 올려라
Springmvc로 만들었지만 다른 것도 마찬가지입니다. 주로 HttpServletResponse 대상과 유효한 목표 파일이 필요합니다.
1. 프론트 데스크 코드

/*
*  
*/
function downloadFromUpload(fileName){
window.location.href = path + "/download?dir=upload&fileName="+encodeURI(encodeURI(fileName));
}
/*
*  
*/
function download(fileName){
window.location.href = path + "/download?dir=download&fileName="+encodeURI(encodeURI(fileName));
}
2. controller 코드

/**
*  ( )
* 
* @param request
* @param response
* @throws IOException
*/
@ResponseBody
@RequestMapping(value = "/download")
public void downloadFile(HttpServletRequest request,
HttpServletResponse response, FileModel model) throws Exception {
String fileName = URLDecoder.decode(model.getFileName(), "UTF-8");
/*
*  upload download 
*/
String folderName = "download";
if (!StringUtils.isEmpty(model.getDir())
&& model.getDir().equals("upload")) {
folderName = "upload";
} else {
folderName = "download";
}
String fileAbsolutePath = request.getSession().getServletContext()
.getRealPath("/")
+ "/WEB-INF/" + folderName + "/" + fileName;
FileTools.downloadFile(request, response, fileAbsolutePath);
log.warn(" Id:"
+ (Integer) (request.getSession().getAttribute("userId"))
+ ", :"
+ (String) (request.getSession().getAttribute("username"))
+ ", :" + fileAbsolutePath);
}
이 다운로드 논리는 프론트에서/다운로드를 요청하고 파일 이름 파라미터를 제시하면 된다는 것이다.중국어 디코딩을 피하기 위해 프론트의 파일 이름은 매개 변수로 사용할 때 js의 encodeURI () 를 사용하여 유니코드 코드로 바꾸고 백엔드 디코딩을 중국어로 변환합니다.또한 프로젝트의 특수성 때문에 제가 다운로드하고자 하는 파일은 업로드와 다운로드 두 폴더에 있을 수 있기 때문에 판단 논리의 일부분을 추가했습니다.또한 파일 이름과 요청한 폴더 이름을 FileModel에 봉인했습니다.
3. 다운로드 논리 실현.
여기는 서비스가 없습니다. 직접 사용하는 정적 방법으로 이루어집니다.

/**
*  
* 
* @param request
* HttpServletRequest
* @param response
* HttpServletResponse
* @param filePath
*  
* @param fileName
*  
* @throws IOException
*/
public static void downloadFile(HttpServletRequest request,
HttpServletResponse response, String filePath, String fileName)
throws IOException {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
bis = new BufferedInputStream(new FileInputStream(filePath));
bos = new BufferedOutputStream(response.getOutputStream());
long fileLength = new File(filePath).length();
response.setCharacterEncoding("UTF-8");
response.setContentType("multipart/form-data");
/*
*  
*/
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? fileName.getBytes()
: fileName.getBytes("UTF-8"); // fileName.getBytes("UTF-8") safari 
fileName = new String(bytes, "ISO-8859-1"); //  ISO 
response.setHeader("Content-disposition",
String.format("attachment; filename=\"%s\"", fileName));
response.setHeader("Content-Length", String.valueOf(fileLength));
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
bis.close();
bos.close();
}
/**
*  
* 
* @param request
* HttpServletRequest
* @param response
* HttpServletResponse
* @param filePath
*  
* @throws IOException
*/
public static void downloadFile(HttpServletRequest request,
HttpServletResponse response, String filePath) throws IOException {
File file = new File(filePath);
downloadFile(request, response, filePath, file.getName());
}
여기에는 클라이언트가 다운로드해야 할 파일 이름을 지정하는 데 필요한 다운로드 방법을 제공합니다.
3. 주의사항
1. MIME 유형 선택
이전에는 미미 유형에 대해 잘 몰랐는데 인터넷에서 다운로드한 원본 코드가 많은 미미 유형이 다르게 설정된 것을 발견했다.바로 이 문장

response.setContentType("multipart/form-data");
MIME 형식을 설정하는 데 클라이언트 브라우저가 다운로드할 파일을 어떤 형식으로 처리하는지 알려주는 역할을 찾았습니다.구체적인 대응 인터넷에는 많은 설명이 있는데 이런 I류는 이런 형식으로 설정하면 일반적으로 자동으로 형식과 일치한다.
2. 클라이언트 다운로드 파일 이름 지정
때때로 우리는 클라이언트가 파일을 다운로드할 때의 파일 이름, 즉 이 코드를 지정해야 할 수도 있다
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
의 fileName을 사용자 정의할 수 있습니다.앞부분은 보통 움직이지 마세요.
3. 중국어 부호 문제 해결
중국어 파일 디코딩은 너무 흔합니다. 프로젝트 시스템 구조가 구축되었을 때 모든 중국어 인코딩을 통일해야 합니다. 편집기, 페이지, 데이터베이스를 포함하여 UTF-8 인코딩을 추천합니다.Spring을 사용하는 경우 중국어 부호를 피하기 위해 Spring의 문자 세트 필터를 구성할 수도 있습니다.
(1) 클라이언트 다운로드 요청 프로세스 파일 이름 부호
때때로 우리는 프론트 데스크톱 페이지에 중국어 파일 이름 다운로드 목록이 표시될 때 정상적이지만, 백그라운드에 가서 요청한 파일 이름이 엉망인 것을 발견할 수 있습니다. 이때 앞에서 말한 encodeURI를 사용하면 해결할 수 있습니다.
(2) 클라이언트 다운로드 실행 시 파일 이름 부호
실제 테스트에서 다른 브라우저가 실행할 수 있는 상황에서 i에서 중국어 파일 이름이 혼란스러울 수 있음을 발견하였다.인터넷에서 이러한 코드를 보았는데, 테스트를 통해 서로 다른 브라우저의 중국어 난자 문제를 완벽하게 해결하였다.

/*
*  
*/
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? fileName.getBytes()
: fileName.getBytes("UTF-8"); // fileName.getBytes("UTF-8") safari 
fileName = new String(bytes, "ISO-8859-1"); //  ISO 
response.setHeader("Content-disposition",
String.format("attachment; filename=\"%s\"", fileName));
(3) 서버에서 파일 부호
서로 다른 서버는 플랫폼에 따라 인코딩 방식이 다를 수 있으므로 주의해야 한다.구체적인 해결 방안은 이전에 쓴 문장을 참고하십시오. 파일 다운로드 과정에서 중국어 부호 처리
위에서 말한 것은 여러분에게 소개된 자바 웹 구현 파일 다운로드와 디코딩 처리 방법입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기