Tag

Web 상에 존재하는 이미지 파일을,
WebRequest와 WebResponse를 이용하여 로컬에 저장하는 방법을 알아봤습니다.

기본적으로 Hoons 닷넷의 다음 강좌를 바탕으로 알아보았습니다.
http://www.hoons.kr/Lecture/LectureView.aspx?BoardIdx=33&kind=26

Request와 Response를 이용하여 이미지 파일을 저장 하는
전체 적인 로직은 다음과 같습니다.

1. Web 상의 해당 이미지 주소에 Request(WebRequest, HttpWebRequest)
2. Request로 부터 요청한 응답을 Response(WebResponse, HttpWebResponse)
3. Response로 부터 해당 이미지의 Stream을 반환
4. Stream을 이용하여 로컬에 이미지 파일을 생성 및 저장

여기서 Request라는 용어와 Response라는 용어가 나오는데 간단히 설명을 하면
다음과 같습니다.

웹에서 데이터 처리는 크게 서버 플랫폼과 클라이언트로 나눠 처리 되는데,
클라이언트는 주로 웹 브라우저를 이용해 서버에 서비스를 요청 합니다.
이러한 요청을 Request라고 하고 이에 대한 서버에서의 응답을 Response 라고 합니다.



먼저, WebRequest와 WebResponse를 이용하여 작업을 진행해 보겠습니다.

1. 해당 주소를 이용하여 WebRequest 를 초기화 합니다.
WebRequest req =
WebRequest.Create(new Uri("
http://images.hangame.co.kr/naver/music/today/musicians/090406/090406_banner.jpg")); 

2. 해당 주소에 대한 요청 및 응답을 반환 합니다.
WebResponse result = req.GetResponse();

3. 요청에 대한 응답(Response)로 부터 해당 이미지의 Stream을 반환 합니다.
Stream ReceiveStream = result.GetResponseStream();

여기 까지가 Web 상의 이미지에 대한 스트림을 받아온 과정 입니다.
WebRequest, WebResponse 뿐만 아니라,

HttpWebRequest, HttpWebResponse를 이용하여 다음과 같이 동일한 작업을 수행할 수 있습니다.

1. 해당 주소를 이용하여 HttpWebRequest를 초기화 합니다.
HttpWebRequest req =
(HttpWebRequest) WebRequest.Create(new Uri("
http://static.naver.com/ncc/2009/04/03/1602091488438415.jpg"));

2. 해당 주소에 대한 요청 및 응답을 반환 합니다.
HttpWebResponse result = (HttpWebResponse)req.GetResponse();

3. 요청에 대한 응답(Response)로 부터 해당 이미지의 Stream을 반환 합니다.
Stream ReceiveStream = result.GetResponseStream();

마찬가지로 여기 까지의 작업이
Web 상의 이미지에 대한 스트림을 받아온 과정 입니다.
WebRequest와 WebResponse를 이용한 것과 별반 차이가 없어 보입니다.

또 한가지,
WebClient를 이용하여 위의 작업과 동일한 작업을 다음과 같이 수행 할 수 있습니다.

1. WebClient 객체를 생성 합니다.
WebClient wc = new WebClient();

2. WebClinet의 OpenReadAsync 메서드 를 이용하여 Web 상의 리소스에서 데이터를 반환 합니다.
wc.OpenReadAsync(new Uri("http://static.naver.com/book/today/090406/img_01.jpg"));

3. WebClient의 OpenReadComplated를 이용하여  데이터의 스트림 값을 반환 합니다.
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
      Stream ReceiveStream = e.Result;
}


여기 까지가 Web 상의 이미지 파일의 스트림을 받아 오는 3가지
방법 이었습니다. (WebRequest, WebResponse, HttpWebRequest, HttpWebResponse, WebClient)

다음 작업으로는 넘겨 받은
Stream을 이용하여 로컬에 해당 이미지 파일을 생성 하는 과정 입니다.
전체적인 과정은 다음과 같습니다.

1. 반환 받은 스트림으로 부터 512 바이트 만큼 read
2. 로컬에 생성될 이미지 파일을 FileStream을 통해서 생성
3. FileStream의 Write 매서드를 통해 512 바이트 만큼 read 한것을 write
4. BinaryWrite를 사용하여 생성된 이미지 파일을 Save


위의 과정을 소스 상으로 보면 다음과 같습니다.

// Byte 배열 생성
Byte[] read = new Byte[512];

// 스트림 내의 현재 위치는 읽은 바이트 수만큼 앞으로 이동(512 바이트 씩 Read)
int bytes = ReceiveStream.Read(read, 0, 512);
            
// 파일 객체 생성
// 파일에 대해 Stream 을 제공하여, 읽기, 쓰기 작업을 모두 지원
Encoding encode;
encode = System.Text.Encoding.Default;


FileStream FileStr = new FileStream("c:\\test.jpg", FileMode.OpenOrCreate, FileAccess.Write);           

// FileStream에 byte 쓰기
// 스트림의 끝에 도달 하면 0 이 Return
while (bytes > 0)
{
       // 버퍼의 데이터를 사용하여 이 스트림에 바이트 블록을 씀
      FileStr.Write(read, 0, bytes);
      bytes = ReceiveStream.Read(read, 0, 512);
       
}

// Save File
BinaryWriter Savefile = new BinaryWriter(FileStr, encode);
Savefile.Close();


이상으로 Request와 Response를 이용하여
Web 상의 이미지 파일에 접근 하고 스트림을 얻어 오는
방법에 대해서 알아보았습니다.

알아보면서 이것 저것 궁금 한것도 생기고
모르는 것도 있었지만 -..- 다음에 필요 할때 알아보면 될 것 같습니다.
(귀차니즘 발동) 

Posted by JMSOFT

댓글을 달아 주세요

  1. 일단 원래 새로운 피드백이 지금은 같은 댓글과 네 이메일을 주석이 추가 될 때마다 추가 - 확인란하고 때 - 알림 나를 클릭 댓글을 달았습니다. 해당 서비스에서 저를 제거 할 수있는 방법이 있습니까? 감사합니다!

  2. 왠일이야. 아주 멋진 웹 사이트! 사람 .. 우수 ... 뛰어난 .. 난 당신의 블로그를 즐겨 찾기에 추가하고 또한 피드 할게요 ... 전 게시물에서 바로 유용한 정보를 많이 찾을 수있어 기뻐요. 공유를위한 감사합니다 ...

티스토리 툴바