Q&A

  • IdHTTP에서 이어받기
안녕하세요? 초보 도련 인사올립니다. (_ _)

흑흑.. 하루종일 붙잡고 있는데 해결책이 잘 안나오네요.. 흑흑..

제가 해 본 방법을 전부 다 적을께요.. 어디서 잘못되었는지.. 뭐가 문제인지..
해결방법을 아시는 고수님 ㅠ.ㅠ 도움 부탁드립니다..

▶ 구현하려는것 : HTTP 를 이용하여 Web 에서 파일을 받아올때의 이어받기 구현 !!

다음과 같은 테스트들을 통하여 여러가지 결과를 얻어낼 수 있었습니다.

※ 변수

FileURL : 받으려고 하는 파일의 위치. 예) http://localhost/sample.zip
toFilename: 받은 파일을 저장할 위치. 예) C:sample.zip

※ 시도해 본것들

IdHTTP.Get() 은 2 가지 Method 를 제공합니다.

1. procedure Get(AURL: string; const AResponseContent: TStream); overload;
2. function Get(AURL: string): string; overload;

우선 2번의 방법으로 해 보았습니다. AURL 을 던지면 해당 URL 을 Data 를 받아와서 string 으로 반환을 해 줍니다. 적은 용량일 경우 상관 없지만 파일이 클 경우... 파일을 받으면 받을수록 전송속도가 현저하게 줄어듭니다. 속도또한 1번의 방법보다 많이 느립니다.

▶ 문제점1 : 속도가 팍팍 줄어든다.. 생각으로는 버퍼때문이지 않나.. 싶네요.
▶ 문제점2 : 전송 도중 중단되면 string 을 반환하지 않는다. 어디까지 받았는지 알 수가 없음.

1번의 방법으로 해 보았습니다. 우선 TFileStream 을 하나 생성하고요.. 결과, 속도는 무지 빠릅니다. 이 방법으로 하였을 경우 로컬 디스크에 받은 파일을 보면... 미리 디스크에 크기가 할당되어 있음을 알 수 있었습니다. 예를 들어 받으려는 sample.zip 파일이 10M 라고 한다면 파일 전송이 시작되면서 부터 하드디스크에는 10M 짜리 파일이 하나 들어 있는거죠.. 파일이 다 받아지면 물론 정상적인 파일이 되지만 만약 다 받아지지 않은경우에도 역시 용량은 10M 그대로 남아 있고 파일은 불완전한 파일이 되어 버립니다. 이게 문제죠...;; 혹시나 싶어 SizOf() 로 출력해 보았더니 4 라는 숫자밖에 안나오네요.. ㅎㅎㅎ

▶ 문제점 : 다 받아지지 않은 파일도 용량이 파일 전체크기만큼 할당 되어버려 어디까지 받았는지 알수가 없다.


위 두가 방법 모두.. 핵심적인 문제점은 어디까지 받았는지 알수가 없다는 거에요..
몇 byte 나 받았는지 말이죠.. 몇 byte 받았는지만 알 수 있어도.. Request 할때 RangeStart 를 설정해서 받은 이후부터 끝까지 받아오게 한 뒤 파일끝에 추가하면 될 터인데..


그래서 IdLogDebug 를 이용하여 IdHTTP 의 Intercepter 에 연결했습니다. 이 LogDebug 의 Target 을 ltDebugOutput 로 설정하고 Active 를 True 로 한뒤 OnLogItem 이벤트에서 AText 값을 TMemo 컴퍼넌트에 뿌려보도록 했습니다.
Sent 한것과 Recv 한게 다 보이네요.. Request/Response 의 Header 정보까지요...
어디부터 Contents 의 시작인지도 명확히 알 수 없었습니다...


어떻게 하면 좋을까요.. ㅠ.ㅠ;;

답변 꼭 부탁드립니다.. ㅠ.ㅠ

0  COMMENTS