Изображения в папке App_Data не отображаются в браузере

Когда я устанавливаю свойство URL-адреса изображения для элемента управления изображением asp, которое находится в папке App_Data, изображение отображается в представлении дизайна страницы, но не в браузере.

<form id="form1" runat="server">
<div>
    <asp:Image ID="Image1" runat="server" ImageUrl="~/App_Data/p3.jpg" />
</div>
</form>

Это кажется простым, но не показывает изображение.

8 ответов

Решение

App_Data папка - это специальная папка, зарезервированная для данных, таких как файлы базы данных и т. д., которая НЕ будет отображать содержимое в Интернете. Это сделано намеренно и не может быть изменено (насколько я знаю).

Ваши изображения определенно не относятся к App_Data подпапка - положить их в /images папка или что-то более подходящее.

Изображения никогда не должны храниться в App_Data Папка. Это зарезервировано для файлов, которые никогда не должны предоставляться пользователю напрямую, таких как файлы базы данных.mdb и т. Д.

Я бы создал /Resources или же /Resources/Images папка вне корня сайта.

Я не согласен. Скрывая изображения в папке App_Data и создавая свой собственный http-обработчик, вы защищаете свои изображения и можете добавлять текст авторского права и т. Д. На изображения, прежде чем их показывать.

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

Ладно, пора сделать невозможное... Хотя вы не можете загружать изображения непосредственно из папки app_data, вы можете написать свой собственный обработчик http, который будет считывать файл изображения из папки app_data и отправлять его обратно клиенту. Это был бы обходной путь, но в целом данные предназначены для данных, которые может прочитать только ваше приложение. Имея обработчик для чтения данных, вы все равно можете вернуть эти изображения.

Но это плохая практика, и если ты будешь работать на меня, тебя уволят немедленно!!!

Это зависит!;)

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

Самое главное, это единственный способ иметь разные файлы на сервер / экземпляр развертывания.

При развертывании приложения вы можете защитить эти файлы, загруженные пользователями для каждого экземпляра сервера, включив "Исключить файлы из App_Data" в конфигурации развертывания.

Если вы хотите получить доступ к этим файлам по URL, используйте обработчик загрузки, например, downloadfile.ashx.

Надеюсь это поможет.

Содержимое из папки App_Data можно обслуживать, но не напрямую.
Прямой доступ невозможен, а косвенный не рекомендуется. Это намеренно.

однако добавление виртуального пути может сделать это. Смотрите этот вопрос


Я думаю, что тройка лучших ответов служит вашей цели.
Храните изображения в папке ресурсов, как глобальных, так и локальных. Это также специальные папки, и содержимое может быть доступно программно.

Если вы используете инструмент администрирования IIS и переходите к фильтрации содержимого (для своего приложения), есть вкладка « Скрытые сегменты », где вы можете удалить App_Data.

Вы заметите, что это добавляется к Web.Config внутри узла «<system.webServer>»:

      <security>
    <requestFiltering>
        <hiddenSegments>
            <remove segment="App_Data" /> 
        </hiddenSegments>
    </requestFiltering>
</security>

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

Настройка WebDeploy, чтобы не удалять другую конкретную папку при использовании клиента пользовательского интерфейса, кажется, по крайней мере, проблематичной (см. Как пропустить удаление папки во время публикации?)

      public string ReturnImage(){
 
alternatively if you wanted to pass a param.

so for example

int WhatEverId = 5;

String folderPath = string.empty;
HostingEnvironment.MapPath("~/App_Data/YourFolder") + @"\" +WhatEverId.ToString());

 string imageYouWantToDisplay = "Test.png";
 string base64String = "";
 String path = HostingEnvironment.MapPath("~/App_Data");
 
 using (Image image = Image.FromFile(path + "/" + imageYouWantToDisplay))
  {
     using (MemoryStream m = new MemoryStream())
      {
        image.Save(m, image.RawFormat);
        byte[] imageBytes = m.ToArray();

        // Convert byte[] to Base64 String
          base64String = Convert.ToBase64String(imageBytes);
      }
    }

    return base64String;

}

затем вы можете вызвать это в методе действия

      public DisplayImages (){
List<WhateverModel> test = new List<WhateverModel>();

 test = GetAll().ToList();

  test.ForEach(x=> { MyImage = ReturnImage();});

  return test;

  }

Вид

      @model WhateverModel
<img src="@MyImage" /> or in js  <img src="${MyImage}" />
Другие вопросы по тегам