기본 콘텐츠로 건너뛰기

[Java] Http File Download 이어받기

Http 서버로부터 다운로드 받는 파일을 이어받기 위해서는 Http Header에 아래 두가지 정보를 추가해 주면 된다.

URLConnection conn = url.openConnection();
conn.setRequestProperty("Accept-Ranges", "bytes");
conn.setRequestProperty("Range", "bytes=" + mOffset + "-");

그러면 서버에서는 해당 Offset으로부터 File을 다운로드 시켜준다.

클라이언트가 요청헤더에 Range 필드를 포함 시켜서 보내면, 서버는 그 정보를 가지고 어디서 부터

파일을 보낼지 판단을 합니다.

하지만 클라이언트가(브라우저) Range 필드를 포함 시켜야 할지를 판단하는 기준은 최초 다운로드

요청시 서버의 응답헤더에 따라

다음 요청헤더에 Range 헤더를 생성할지 않할지 판단하게 됩니다.

그걸 당락짓는 응답 헤더 필드는 다음과 같습니다.

Accept-Ranges , ETag, Last-Modified

반드시 위 필드를 응답 헤더에 같이 보내줘야 클라이언트는 다음 요청시 Range헤더를 포함시켜 보내게 됩니다.

참고로 말씀 드리면 위 필드를 포함 시켜서 보내더라도 value는 반드시 " " 로 묶어서 보내야 합니다.

안그러면 브라우저는 죽어도 Range 필드를 생성시키지 않습니다.

HTTP 1.1 스펙은 따옴표를 강제적으로 해줘라 이런 내용 없습니다.

자바기준 40byte의 파일이라치면
클리이언트 요청을 두번으로 나누었다치면 이케 connection.setRequestProperty("Range", "bytes=0-20"); connection.setRequestProperty("Range", "bytes=20-40");

단 conn.getContentLength();을 통해서 얻어온 Download할 File의 크기는 offset을 제외한 File의 크기이다.

static final int DOWNLOAD_DONE = 0;
static final int DEFAULT_TIMEOUT = 30000;
long fileSize, remains, lenghtOfFile = 0;
mUrl = args[1];

File file = new File('path');
if (file.exists() == false) {
    file.createNewFile();
}
RandomAccessFile output = new RandomAccessFile(file.getAbsolutePath(), "rw");
fileSize = output.length();
output.seek(fileSize);
 
URL url = new URL(mUrl);
URLConnection conn = url.openConnection();
conn.setRequestProperty("Range", "bytes=" + String.valueOf(fileSize) + '-');
conn.connect();
conn.setConnectTimeout(DEFAULT_TIMEOUT);
conn.setReadTimeout(DEFAULT_TIMEOUT);
remains = conn.getContentLength();
lenghtOfFile = remains + fileSize;
 
if ((remains <= DOWNLOAD_DONE) || (remains == fileSize)) {
    return null;
}
InputStream input = conn.getInputStream();
   
byte data[] = new byte[1024];
int count = 0;
 
if (fileSize < lenghtOfFile) {
    while((count = input.read(data)) != -1) {
        output.write(data, 0, count);
    }
}
output.close();
input.close();

댓글

  1. String tempFileName = "/home/weblink/data/파일명
    InputStream tempIS = null;
    OutputStream tempOS = null;
    File file = null;
    try{
    FileDownload.setDisposition(fileName, request, response);

    file = new File(tempFileName);
    tempIS = new FileInputStream(file);
    tempOS = response.getOutputStream();
    int leng = 0;

    while((leng = tempIS.read(buffer)) > 0){
    tempOS.write(buffer,0,leng);
    }
    tempIS.close();
    tempOS.close();
    } catch (Exception e) {
    e.printStackTrace();
    if( tempIS != null ){ tempIS.close(); }
    if( tempOS != null ){ tempOS.close(); }
    }

    이런식으로 downloadService.java가 되어있는데..
    URL url = new URL(mUrl); 여기서 mUrl 값에는 어떤값이 들어가야 하는지 궁금합니다. fileDown.do?파라미터 블라블블라 이런식의 URL인데 그값을 넣어줘야하는건지..그값을 넣어도 되질 않아서..그값이 아닌 파일의 경로를 URL로 찾아야 하는건지 오래된 글이라서 보실지 모르겠지만 보시면 답변좀 부탁드리겠습니다. 꾸벅

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

톰캣 세션 타임 아웃 설정

web.xml 파일이 있습니다. 이 파일을 열어서 session이라고 검색해 보십시오. <session-config>   <session-timeout>360</session-timeout> </session-config> 위 단락을 찾을 수 있습니다. session-timeout 시간 360이 바로 자동로그아웃 세션 시간입니다.  단위는 분이고요. 30분으로 하고 싶으시면 30으로 바꿔서 저장해주시면 되는 것이죠~ Tomcat 내에서 Session Timeout 를 설정하는 우선 순위가 존재 한다. session.setMaxInactiveInterval() 프로그램내에서 time out 를 설정했을 경우 Web application 내의 WEB-INF/web.xml Tomcat 내의 conf/web.xml 실제로 Tomcat(conf/web.xml)내에 Default 로 설정되어 있는 것은 다음과 같다. < HttpSession 메서드 > getCreationTime() - 세션 생성 시간 getLastAccessedTime() - 마지막 요청 시간 setMaxInactiveInterval() - 최대허용시간 설정 (초) getMaxInactiveInterval() - 최대허용시간 invalidate() - 세션 제거 < 타임아웃 설정하기 > - 일정 시간 동안 요청이 없으면 세션을 제거한다  1. DD에서 전체 세션 타임아웃 설정       web.xml 1. DD에서 전체 세션 타임아웃 설정       web.xml <web-app ... >     <servlet>        ...

java 특정 디렉토리에 있는 파일 목록을 읽어내기, 정렬해서 가져오기

폴더 리스트 가져오기 String path="C:\"; File dirFile=new File(path); File []fileList=dirFile.listFiles(); for(File tempFile : fileList) {   if(tempFile.isFile()) {     String tempPath=tempFile.getParent();     String tempFileName=tempFile.getName();     System.out.println("Path="+tempPath);     System.out.println("FileName="+tempFileName);     /*** Do something withd tempPath and temp FileName ^^; ***/   } } 정렬해서 가져오기 import java.io.FileFilter; import java.io.IOException; import java.util.Arrays; import java.util.Date; import org.apache.commons.io.comparator.LastModifiedFileComparator; import org.apache.commons.io.filefilter.FileFileFilter; public class LastModifiedFileComparatorTest { public static void main(String[] args) throws IOException { File directory = new File("."); // get just files, not directories File[] files = directory.listFiles((FileFilter) FileFileFilter.FILE); System.out.println("Defaul...

dmesg 메시지 실시간으로 보기

참조사이트 http://imitator.kr/Linux/556 # tail -f /var/log/messages # tail -f |dmesg //기본 2초 단위로 갱신 된다. # watch "dmesg | tail -f" //1초 단위로 갱신하면서 보여준다. # watch -n 1 "dmesg | tail -f" // 보여주는 줄을 20으로 늘린다. (기본 10줄) # watch -n 1 "dmesg | tail -f -n 20"