Http 정지점
한편, 서버 가 돌아 올 때 일반 모드 와 다른 것 은 다음 과 같다. 1: 속성 이 하나 더 생 겼 다. Content - Range = bytes 100000 - 1999 / 20000 은 설정 해 야 할 속성 이 있 습 니 다. 일반 모드 와 마찬가지 로 Content - Length 속성 2: 반환 코드 는 206 입 니 다.
그리고 실제 응용 프로그램의 단점 다운로드 코드 를 살 펴 보 겠 습 니 다. 여기 서 제 가 사용 한 것 은 SpringMVC 모델 입 니 다.
@SuppressWarnings({ "unchecked" })
@RequestMapping(value = "/downOdex.do")
public ResponseEntity<String> downFile(
@RequestParam(value="odexName")String odexName,
HttpServletResponse response,
HttpServletRequest request){
InputStream inputStream = null;
ServletOutputStream out = null;
try {
File file = new File(OdexManage.odexFileBasePath + "\\" + odexName);
int fSize = Integer.parseInt(String.valueOf(file.length()));
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-download");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Length", String.valueOf(fSize));
response.setHeader("Content-Disposition", "attachment;fileName=" + odexName);
inputStream=new FileInputStream(OdexManage.odexFileBasePath + "\\" + odexName);
long pos = 0;
if (null != request.getHeader("Range")) {
//
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
try {
pos = Long.parseLong(request.getHeader("Range").replaceAll("bytes=", "").replaceAll("-", ""));
} catch (NumberFormatException e) {
pos = 0;
}
}
out = response.getOutputStream();
String contentRange = new StringBuffer("bytes ").append(pos+"").append("-").append((fSize - 1)+"").append("/").append(fSize+"").toString();
response.setHeader("Content-Range", contentRange);
inputStream.skip(pos);
byte[] buffer = new byte[1024*10];
int length = 0;
while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, length);
Thread.sleep(100
);
}
} catch (Exception e) {
logger.error("ODEX :"+e);
}finally{
try {
if(null != out) out.flush();
if(null != out) out.close();
if(null != inputStream) inputStream.close();
} catch (IOException e) {
}
}
return new ResponseEntity(null,HttpStatus.OK);
}
그 중점 은 HTTP 프로 토 콜 의 속성 이 다른 부분 이 있 고, InputStream 이 읽 을 필요 가 없 는 파일 을 건 너 뛰 고, 흐름 을 닫 는 데 주의 하 는 것 이다.핵심 코드 를 통 해 알 수 있 듯 이 스프링 MVC 인지 아 닌 지 는 상관 이 없 기 때문에 프로젝트 에 쉽게 적용 할 수 있 습 니 다.
예 를 들 어 이 코드 에 대해 저 는 다음 과 같은 경 로 를 방문 합 니 다 http://localhost/api/downOdex.do?odexName=D03BFBAE35BEC791092E52EC907D1F69.ZIP.
브 라 우 저 자체 다운로드 도 구 를 사용 하여 다운로드 와 중단 을 제어 하여 정지점 다운로드 과정 을 관찰 할 수 있 습 니 다.
타임 을 누 르 면 다운로드 가 멈 추 는 것 을 볼 수 있 습 니 다.
계속 다운로드 할 수 있 습 니 다.
그 과정 에서 클 라 이언 트 가 바로 파일 을 다운로드 하지 않 고 천천히 다운로드 하 는 것 을 볼 수 있 습 니 다. 바로 제 가 프로그램 에서 중단 을 추가 하여 이 다운로드 과정 을 보기 때 문 입 니 다.
Thread.sleep(100);
그리고 저희 버퍼 는 요.
byte[] buffer = new byte[1024*10];
그래서 초당 속 도 는 100 KB 이론 속도 이 고 로 컬 이기 때문에 초당 100 KB 에 가깝다.
당신 은 ITEYE 사이트 에 가서 자바 소 강 오리지널 을 보 세 요. 감사합니다!http://cuisuqiang.iteye.com/ !
자체 블 로그 주소: http://www.javacui.com/ ,콘 텐 츠 와 ITEYE 동기 화!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
빠른 팁: SingleStoreDB의 데이터 API 사용SingleStoreDB는 HTTP 연결을 통해 SQL 문을 실행하는 데 사용할 수 있는 을 제공합니다. 이 짧은 문서에서는 이 데이터 API를 사용하는 방법에 대한 예를 보여줍니다. A는 무료 SingleStore...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.