Проверьте, существует ли изображение в C#

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

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

Я изо всех сил пытаюсь понять, как написать этот код.

Любая помощь приветствуется.

Спасибо

Что, если я хочу протестировать страницу с URL-адресом вроде http://localhost/homepage и посмотреть, есть ли на этой странице отсутствующее изображение? Моя первоначальная идея - прочитать страницу с помощью HttpWebRequest, получить ответ, а затем просмотреть содержимое, для каждого элемента <img> порождать другой запрос. Есть какая-нибудь другая идея?

Dio Phung 15.08.2014 08:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
25
2
36 396
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

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

bool exists;
try
{
    request.GetResponse();
    exists = true;
}
catch
{
   exists = false;
}

Можно ли применить этот метод к папкам, если они существуют или нет?

JL. 22.12.2009 17:03

@JL, какие папки? файловая система ??

Kiquenet 01.09.2010 01:44

Разве это не вернется к каждому файлу, а не только к изображениям?

Rudey 23.05.2014 16:40

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

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

hth Джек

Единственное, что он загрузит, - это заголовок ответа, который по определению является «ответом».

Greg Dean 10.10.2008 20:38

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

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";
}

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

Я хотел бы добавить, что если вы добавите оператор using вокруг запроса HttpWebResponse ... вы убедитесь, что ваше приложение не зависнет после трех последовательных запросов. Этот сценарий может возникнуть при использовании BackgroundWorker. using (HttpWebResponse response = (HttpWebResponse) request.GetResponse ()) {// здесь логика}

asuciu 28.08.2012 21:37

Также, если вы получите ошибку ProtocolError (удаленный сервер вернул ошибку: (500) Internal Server Error), измените: request.Method = "GET";

asuciu 28.08.2012 22:49

Какой mimeType нужно указать для изображения?

Shimmy Weitzhandler 07.11.2012 20:41

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

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

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

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

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

Если 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;
}

Другие вопросы по теме