GSI

사용자 삽입 이미지

HTTP 프로토콜을 사용해서 원격파일 다운로드 프로그램 만들고 있습니다.

HTTP 를 통해서 파일을 받을때는 WebClient 를 사용하고 있다.
단순하게 다운로드 받기 위해서는 아래와 같이 DownloadFile()를 사용한다.

WebClient webclient = new WebClient();
webclient.DownloadFile(updatelistUrl, updatelistTxt);


그리고 다운로드 받는 상태를 알기 위해서는 DownloadFile 가 아닌 DownloadFileAsync 를 사용해야 한다.
그리고 받는 동안 호출되는 이벤트 함수와 다 받은후 처리 하는 함수를 등록해야 한다.

// 객체 생성
WebClient client = new WebClient();

// 이벤트 함수 등록
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);

// 받는 동안 프로그래스바의 Value에 추가한다. (퍼센트 값이 바로 제공된다.)
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    progressfile.Value = e.ProgressPercentage;
}
//
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{

}


파일을 실제로 다운로드 받을때는 아래와 같이 처리 합니다.
(DownloadFileAsync 이것을 사용해야 이벤트 함수가 호출 됩니다.)

client.DownloadFileAsync(new Uri(curFile.Url), curFile.Path);


스레드로 해도 될 듯 한데 우선 작업 하기 편하게 타이머를 사용해서 제작 하였습니다.
Test 버튼을 누르면 해당 동작이 시작 됩니다.


[동작 순서]

  1. Updatelist.txt 파일을 다운로드 한다.
  2. Updatelist.txt 파일의 정보를 분석해서 다운로드할 파일을 구성한다.
  3. 해당 파일을 타이머를 통해서 다 받을 때 까지 반복한다.
  4. 다 받으면 자동 종료 또는 특정 실행 파일을 실행한다.
Posted by gsi
:

웹의 경로에 위치한 이미지를 가져오는 모듈입니다.
원래 이미지 사이즈를 구하기 위해서 사용했던건데요.
파일 다운로드 쪽으로 활용해도 가능성이 있을듯 하네요.

try
{
    byte[] data = new System.Net.WebClient().DownloadData(url);
    System.IO.MemoryStream ms = new System.IO.MemoryStream(data);
    Image img = Image.FromStream(ms);

    Size size = new Size(img.Width, img.Height);
    return size;
}
catch(Exception ex)
{
    return new Size(-1, -1);
}

msdn 주소 : http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=637975&SiteId=1
키워드 : Image Url

Posted by gsi
:

사용자 삽입 이미지

이미지는 웹 iis 쪽에 있으며 그 이미지를 ImageList에 Form_Load() 시에 추가하고 Listview에 연결한 후에 item을 추가 한 코드 예제 입니다.

string[] filepathlist =
{
"http://localhost:8888/_01.gif",
"http://localhost:8888/_01.gif",
"http://localhost:8888/_02.gif",
"http://localhost:8888/_03.gif",
};

int count = 0; // Item 이름을 위한 임시 변수
foreach (string path in filepathlist)
{
    // WebClient 를 사용해서 원격 이미지를 로드 하고 Stream에 Write 한다.
    WebClient client = new WebClient();
    byte[] myDataBuffer = client.DownloadData(path);
    Stream stream = new MemoryStream();
    stream.Write(myDataBuffer, 0, myDataBuffer.Length);

    // Bitmap에 Stream을 입력 하고 ImageList에 등록한다.
    Bitmap bmp = new Bitmap(stream);
    this.imageList1.Images.Add(bmp);
    int idx = this.imageList1.Images.Keys.Count - 1;
    this.imageList1.Images.SetKeyName(idx, "");

    // ListViewItem에 값을 채우고 ListView에 추가 한다.
    ListViewItem listviewitem = new ListViewItem("test" + count.ToString(), idx);
    this.listView1.Items.Add(listviewitem);

    count++;
}

Posted by gsi
:

사용자 삽입 이미지
 
위와 같이 iis 쪽에 해당 이미지가 있다고 했을때 Winform 쪽에 PictureBox에 이미지를 Url 로 추가 하면 안되는거 같다.( 바로 적용이 가능한지 아시는분은 답변 부탁 ^^)
그래서 웹 브라우져 컨트롤을 써자니 좀 이상해서 PictureBox에 사용하기 위해서는 원격 주소에 있는 데이터를 클라이언트로 가져와야 하는걸 알았다.

이때 두가지 경우가 있는데 스트림, 파일 이 있다. 파일 보다는 스트림이 나을거 같아서 이것을 채택 했다.

그리고 위의 소스를 보면 아시겠지만 DB의 정보를 가져 와서 보여 주는 뷰어로 사용할려다 보니 DataSet와 연동을 하였다.

icon_img 정보를 가져 와서 iis의 주소에 맵핑 해서 해당 이미지를 보여 주도록 하였다.
그래서 바인딩 부분에서 몇가지 수정이 필요하다.

PictureBox에 바인딩이 있다고 가정한다.
Binding binding = icon_imgPictureBox.DataBindings["Image"];
binding.Format += new ConvertEventHandler(binding_Format);

위와 같이 Format 이벤트를 하나 생성한다.
그리고 아래와 같이 작성합니다.

void binding_Format(object sender, ConvertEventArgs e)
{
    if (e.Value != null)
    {
        try
        {
             //e.Value에 있는 값을 사용해서 파일 경로를 생성한다.
            string filepath = "http://local:8888/Icon/2000/" + e.Value + ".gif";
            // WebClient 객체를 생성해서 스트림을 가져 오도록 한다.
            WebClient client = new WebClient();
            byte[] myDataBuffer = client.DownloadData(filepath);
            // Stream 값을 가져 온다.
            Stream stream = new MemoryStream();
            stream.Write(myDataBuffer, 0, myDataBuffer.Length);
            // PictureBox에 스트림으로 로드 한다.
            this.icon_imgPictureBox.Image = Image.FromStream(stream, true);
        }
        catch (WebException webex)
        {
        }
    }
}

try, catch 를 사용한 이유는 e.Value 에 값이 파일 이름이 아닌 다른 정보가 들어 오는 경우가 있다. 그래서 catch로 넘기도록 해서 에러를 없애도록 한다.

Posted by gsi
: