Проверьте, существует ли изображение в C # - PullRequest
19 голосов
/ 10 октября 2008

Я пишу диагностическую страницу для SiteScope, и одна область, которую нам нужно проверить, - это доступность соединения с файловыми / мультимедийными ресурсами с веб-сервера. Один из способов сделать это - загрузить изображение с помощью кода и проверить, является ли сообщение о состоянии IIS 200.

Так что в принципе я должен иметь возможность перейти на сайт к папке, подобной этой: /media/1/image.jpg, и посмотреть, вернет ли она 200 ... если не выбросить исключение.

Я пытаюсь понять, как написать этот код.

Любая помощь очень ценится.

Спасибо

Ответы [ 7 ]

44 голосов
/ 10 октября 2008

Просто используйте ГОЛОВУ. Не нужно загружать все изображение, если оно вам не нужно. Вот некоторый шаблонный код.

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url");
request.Method = "HEAD";

bool exists;
try
{
    request.GetResponse();
    exists = true;
}
catch
{
   exists = false;
}
16 голосов
/ 10 октября 2008

Возможно, вы также захотите проверить, что вы получили код состояния 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;
    }
}
7 голосов
/ 25 октября 2008

Вы должны избавиться от объекта 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;
            }
    }
6 голосов
/ 10 октября 2008

Я использовал что-то подобное раньше, но, возможно, есть лучший способ:

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";
}
1 голос
/ 07 октября 2013

Если 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;
}
1 голос
/ 02 ноября 2011

Если вы получаете исключение во время запроса типа «Удаленный сервер возвратил ошибку: (401) Не авторизовано.»,

Эту проблему можно решить, добавив следующую строку

request.Credentials = new NetworkCredential(username, password);

Вопрос и ответ на этот вопрос добавлен из Проверьте, существует ли изображение в интрасети .

0 голосов
/ 10 октября 2008

Вместо этого я бы заглянул в HttpWebRequest - я думаю, что предыдущий ответ действительно загрузит данные, тогда как вы должны иметь возможность получить ответ без данных из HttpWebRequest.

http://msdn.microsoft.com/en-us/library/456dfw4f.aspx до тех пор, пока шаг 4 не сделает свое дело. В HttpWebResponse есть другие поля для получения числового кода, если это необходимо ...

НТН Jack

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...