Проверьте, существует ли изображение в С#
Я пишу диагностическую страницу для SiteScope, и одна область, которую нам нужно проверить, - это подключение к файлу/медиа-ресурсам с веб-сервера. Один из способов, которым я могу это сделать, - загрузить изображение по коду и проверить, соответствует ли сообщение статуса IIS 200.
Итак, в основном я должен иметь возможность перемещаться по сайту в папку:/media/1/image.jpg и видеть, возвращает ли она 200... если не исключение.
Я пытаюсь выяснить, как написать этот код.
Любая помощь очень ценится.
Спасибо
Ответы
Ответ 1
Просто используйте HEAD. Не нужно загружать все изображение, если оно вам не нужно. Вот какой шаблонный код.
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url");
request.Method = "HEAD";
bool exists;
try
{
request.GetResponse();
exists = true;
}
catch
{
exists = false;
}
Ответ 2
Вы также можете проверить, что у вас есть код состояния OK (например, HTTP 200) и что тип mime из объекта ответа соответствует ожидаемому. Вы можете расширить это по строкам,
public bool doesImageExistRemotely(string uriToImage, string mimeType)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToImage);
request.Method = "HEAD";
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK && response.ContentType == mimeType)
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}
Ответ 3
Я использовал что-то подобное раньше, но, вероятно, лучший способ:
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://somewhere/picture.jpg");
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
myImg.ImageUrl = "http://somewhere/picture.jpg";
}
catch (Exception ex)
{
// image doesn't exist, set to default picture
myImg.ImageUrl = "http://somewhere/default.jpg";
}
Ответ 4
Вы должны избавиться от объекта HTTPWebResponse, иначе у вас будут проблемы, которые у меня были...
public bool DoesImageExistRemotely(string uriToImage)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToImage);
request.Method = "HEAD";
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
}
}
catch (WebException) { return false; }
catch
{
return false;
}
}
Ответ 5
Если вы получаете исключение во время запроса, например: "Удаленный сервер возвратил ошибку: (401)" Неавторизованный ".,
Это можно решить, добавив следующую строку
request.Credentials = new NetworkCredential(username, password);
Вопрос и ответ добавлены к этим вопросам из проверьте, существует ли изображение в интрасети.
Ответ 6
Если url существует как http:\server.myImageSite.com, то ответ тоже ложный
только если значение imageSize > 0 истинно.
public static void GetPictureSize(string url, ref float width, ref float height, ref string err)
{
System.Net.HttpWebRequest wreq;
System.Net.HttpWebResponse wresp;
System.IO.Stream mystream;
System.Drawing.Bitmap bmp;
bmp = null;
mystream = null;
wresp = null;
try
{
wreq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
wreq.AllowWriteStreamBuffering = true;
wresp = (HttpWebResponse)wreq.GetResponse();
if ((mystream = wresp.GetResponseStream()) != null)
bmp = new System.Drawing.Bitmap(mystream);
}
catch (Exception er)
{
err = er.Message;
return;
}
finally
{
if (mystream != null)
mystream.Close();
if (wresp != null)
wresp.Close();
}
width = bmp.Width;
height = bmp.Height;
}
public static bool ImageUrlExists(string url)
{
float width = 0;
float height = 0;
string err = null;
GetPictureSize(url, ref width, ref height, ref err);
return width > 0;
}
Ответ 7
Вместо этого я бы посмотрел на HttpWebRequest - я думаю, что предыдущий ответ будет фактически загружать данные, тогда как вы должны иметь возможность получить ответ без данных из HttpWebRequest.
http://msdn.microsoft.com/en-us/library/456dfw4f.aspx до шага # 4 должен сделать трюк. В HttpWebResponse есть другие поля для получения числового кода, если это необходимо...
НТН
Джек