반응형
.NET / C #의 사이트에서 이미지 다운로드
사이트에서 이미지를 다운로드하려고합니다. 이미지를 사용할 수있는 동안 사용중인 코드가 제대로 작동합니다. 이미지를 사용할 수 없으면 문제가 발생합니다. 이미지의 가용성을 확인하는 방법은 무엇입니까?
암호:
방법 1 :
WebRequest requestPic = WebRequest.Create(imageUrl);
WebResponse responsePic = requestPic.GetResponse();
Image webImage = Image.FromStream(responsePic.GetResponseStream()); // Error
webImage.Save("D:\\Images\\Book\\" + fileName + ".jpg");
방법 2 :
WebClient client = new WebClient();
Stream stream = client.OpenRead(imageUrl);
bitmap = new Bitmap(stream); // Error : Parameter is not valid.
stream.Flush();
stream.Close();
client.dispose();
if (bitmap != null)
{
bitmap.Save("D:\\Images\\" + fileName + ".jpg");
}
편집하다:
Stream에는 다음 문이 있습니다.
Length '((System.Net.ConnectStream)(str)).Length' threw an exception of type 'System.NotSupportedException' long {System.NotSupportedException}
Position '((System.Net.ConnectStream)(str)).Position' threw an exception of type 'System.NotSupportedException' long {System.NotSupportedException}
ReadTimeout 300000 int
WriteTimeout 300000 int
이미지 클래스를 포함 할 필요가 없습니다 WebClient.DownloadFile
. 다음을 호출하면됩니다 .
string localFilename = @"c:\localpath\tofile.jpg";
using(WebClient client = new WebClient())
{
client.DownloadFile("http://www.example.com/image.jpg", localFilename);
}
업데이트
파일이 있는지 확인하고 파일이있는 경우 다운로드하기를 원하므로 동일한 요청 내에서이 작업을 수행하는 것이 좋습니다. 이를 수행하는 방법은 다음과 같습니다.
private static void DownloadRemoteImageFile(string uri, string fileName)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// Check that the remote file was found. The ContentType
// check is performed since a request for a non-existent
// image file might be redirected to a 404-page, which would
// yield the StatusCode "OK", even though the image was not
// found.
if ((response.StatusCode == HttpStatusCode.OK ||
response.StatusCode == HttpStatusCode.Moved ||
response.StatusCode == HttpStatusCode.Redirect) &&
response.ContentType.StartsWith("image",StringComparison.OrdinalIgnoreCase))
{
// if the remote file was found, download oit
using (Stream inputStream = response.GetResponseStream())
using (Stream outputStream = File.OpenWrite(fileName))
{
byte[] buffer = new byte[4096];
int bytesRead;
do
{
bytesRead = inputStream.Read(buffer, 0, buffer.Length);
outputStream.Write(buffer, 0, bytesRead);
} while (bytesRead != 0);
}
}
}
요컨대, 응답 코드는 하나의 파일, 확인을 요청한다 OK
, Moved
또는 Redirect
, 또한 (가) 것을 ContentType
화상이다. 이러한 조건이 참이면 파일이 다운로드됩니다.
약간의 수정이있는 프로젝트에서 위의 Fredrik의 코드를 사용했습니다.
private static bool DownloadRemoteImageFile(string uri, string fileName)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (Exception)
{
return false;
}
// Check that the remote file was found. The ContentType
// check is performed since a request for a non-existent
// image file might be redirected to a 404-page, which would
// yield the StatusCode "OK", even though the image was not
// found.
if ((response.StatusCode == HttpStatusCode.OK ||
response.StatusCode == HttpStatusCode.Moved ||
response.StatusCode == HttpStatusCode.Redirect) &&
response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
{
// if the remote file was found, download it
using (Stream inputStream = response.GetResponseStream())
using (Stream outputStream = File.OpenWrite(fileName))
{
byte[] buffer = new byte[4096];
int bytesRead;
do
{
bytesRead = inputStream.Read(buffer, 0, buffer.Length);
outputStream.Write(buffer, 0, bytesRead);
} while (bytesRead != 0);
}
return true;
}
else
return false;
}
주요 변경 사항은 다음과 같습니다.
- 원격 파일이 404를 반환했을 때 예외가 발생했을 때 GetResponse ()에 대한 try / catch 사용
- 부울 반환
DownloadData 메서드도 사용 가능
private byte[] GetImage(string iconPath)
{
using (WebClient client = new WebClient())
{
byte[] pic = client.DownloadData(iconPath);
//string checkPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +@"\1.png";
//File.WriteAllBytes(checkPath, pic);
return pic;
}
}
private static void DownloadRemoteImageFile(string uri, string fileName)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if ((response.StatusCode == HttpStatusCode.OK ||
response.StatusCode == HttpStatusCode.Moved ||
response.StatusCode == HttpStatusCode.Redirect) &&
response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
{
using (Stream inputStream = response.GetResponseStream())
using (Stream outputStream = File.OpenWrite(fileName))
{
byte[] buffer = new byte[4096];
int bytesRead;
do
{
bytesRead = inputStream.Read(buffer, 0, buffer.Length);
outputStream.Write(buffer, 0, bytesRead);
} while (bytesRead != 0);
}
}
}
서버 또는 웹 사이트에서 이미지를 다운로드하여 로컬에 저장하는 모범 사례입니다.
WebClient client=new Webclient();
client.DownloadFile("WebSite URL","C:\\....image.jpg");
client.Dispose();
참고 URL : https://stackoverflow.com/questions/3615800/download-image-from-the-site-in-net-c
반응형
'Programing' 카테고리의 다른 글
Jenkins에서 일정은 어떻게 구축됩니까? (0) | 2020.11.26 |
---|---|
iPad의 현재 방향을 얻으시겠습니까? (0) | 2020.11.26 |
확장 가능한 목록보기 그룹 아이콘 표시기를 오른쪽으로 이동 (0) | 2020.11.26 |
Ajax 게시물의 JQuery 확인 성공 (0) | 2020.11.26 |
자바의 희소 행렬 / 배열 (0) | 2020.11.25 |