먼저 파일 다운로드의 가장 간단한 예를 살펴보겠습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 com.yyz.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//파일 다운로드
공개 클래스 ResponseDemo는 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
String realpath = this.getServletContext().getRealPath("/download/1.gif");
문자열 파일명 = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("content-disposition", "attachment;filename="+filename);
//서버는 이 헤더를 사용하여 브라우저에게 다운로드 모드에서 데이터를 열도록 지시합니다.
FileInputStream in = new FileInputStream(realpath);
int len = 0;
바이트 버퍼[]=새 바이트[1024];
OutputStream 출력 = response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(버퍼, 0, len);
}
넣다();
//닫을 필요가 없습니다. 응답이 파괴되면 서버는 응답과 관련된 스트림을 자동으로 닫습니다.
}
공개 무효 doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
doGet(요청,응답);
}
}
이 코드의 기능은 서버에서 그림 1.png를 다운로드하는 것입니다. MyEclipse의 패키지 탐색기를 사용하면 디렉토리 구조가 다음과 같이 표시됩니다.
좀 더 어렵게 만들어 보겠습니다. 다운로드하려는 파일은 중국어 이름을 가진 파일입니다. http 프로토콜의 헤더 파일에 있는 내용은 ASCII 문자만 가능하므로 위의 방법(String realpath = this.getServletContext().getRealPath("/download/1.gif");을 String realpath = this로 직접 변경합니다. getServletContext().getRealPath("/download/picture.gif");) 파일을 직접 가져오고,
잘못된 코드 문제가 발생합니다. 테스트 결과는 다음과 같습니다.
이 문제를 해결하려면 URLEncoder 클래스의 encode 메서드를 사용하세요.
다음과 같이 코드 코드를 복사합니다.
패키지 com.yyz.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
java.net.URLEncoder 가져오기;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//중국어 파일을 다운로드할 때 중국어 파일 이름을 URL로 인코딩해야 합니다.
공개 클래스 ResponseDemo는 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
String realpath = this.getServletContext().getRealPath("/download/picture.gif");
문자열 파일명 = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
//이 함수는 문자열을 URL로 인코딩합니다.
FileInputStream in = new FileInputStream(realpath);
int len = 0;
바이트 버퍼[]=새 바이트[1024];
OutputStream 출력 = response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(버퍼, 0, len);
}
넣다();
}
공개 무효 doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
doGet(요청,응답);
}
}
테스트 결과는 다음과 같습니다.
또한 모든 사람이 주의해야 할 작은 세부 사항이 있습니다.
FileInputStream 대신 FileReader를 사용할 수 없습니다. FileReader를 사용하면 데이터가 손실됩니다. 이유는 FileReader는 문자 스트림이며 사진, 미디어 파일 등의 데이터가 01 형식으로 저장되기 때문입니다. FileReader로 읽을 경우 인코딩 테이블을 참조해야 합니다. 인코딩이 지정되지 않은 경우 해당 플랫폼의 기본 인코딩이 사용됩니다. 예를 들어 중국의 컴퓨터는 GB2312를 확인합니다. GB2312 코드 테이블에 존재하지 않는 코드를 읽으면 데이터가 '? ', 데이터는 중국어가 되고 '? '혼합. 클라이언트에 보낸 후 표시할 때 코드 테이블을 다시 확인하고 '?'를 모두 '?' 코드로 바꾸면 데이터가 손실됩니다. 이 세부 사항에 대해 한 가지만 기억하십시오. 바이트 스트림은 모든 유형의 데이터를 처리할 수 있지만 문자 스트림은 문자 데이터만 처리할 수 있습니다.