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) 서버에서 파일 부호서로 다른 서버는 플랫폼에 따라 인코딩 방식이 다를 수 있으므로 주의해야 한다.구체적인 해결 방안은 이전에 쓴 문장을 참고하십시오. 파일 다운로드 과정에서 중국어 부호 처리
위에서 말한 것은 여러분에게 소개된 자바 웹 구현 파일 다운로드와 디코딩 처리 방법입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Javaweb에서 양식 데이터를 가져오는 다양한 방법Javaweb에서 양식 데이터를 가져오는 몇 가지 방법 1. 키 값이 맞는 형식으로 폼 데이터를 얻는다 getParameter(String name): 키를 통해 value를 반환합니다. getParameterVal...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.