tahirraza21 Ответов: 1

Изображение не показывает MVC-5


**In browser view source:**
<img src="D:\VS 2013\BusinessClass2\BusinessClass2\Img\butterfly(Butterfly).jpg" />
but image is not showing at all.
**In Controller:** 
string name = Path.GetFileNameWithoutExtension(fileName); //getting file name without extension  
string myfile = name + "(" + employee.Emp_name + ")" + ext; // append Employee name
var path = Path.Combine(Server.MapPath("~/Img"), myfile);


Что я уже пробовал:

**в виду:**
&ЛТ;ИМГ СРЦ="@HTML-код.Сырой(поз.Emp_image)"/&ГТ;
**также пробовать:**
&ЛТ;ИМГ СРЦ="@URL-адрес.Содержание(пункт.Emp_image)"/&ГТ;

1 Ответов

Рейтинг:
8

David_Wimbley

Если ваш образ не показывает его, потому что он не существует. Убедитесь, что файл D:\VS 2013\BusinessClass2\BusinessClass2\Img\butterfly (Butterfly).jpg существует и что ваше веб-приложение имеет надлежащие права безопасности на этот файл/каталог.


tahirraza21

Изображение с таким же именем присутствует в этой конкретной папке.. есть ли другой способ сохранить только ~\Img\pic.jpg вместо того чтобы сохранить весь путь к корневому каталогу

David_Wimbley

Когда вы говорите только сохранить ~/Img/pic.jpg вы хотите сказать, что сохраняете путь к файлу в БД?

tahirraza21

Да, конечно .. предположим, я запускаю это решение на любой другой машине, у которой нет диска "D:", и вам лучше знать, что произойдет??

David_Wimbley

Вам нужно либо разместить все файлы в папке в вашем решении проектов.

Например, у вас должна быть папка с надписью Content. Внутри этой папки добавьте еще одну, называемую Images. Тогда каталог, который вы сохраните, будет ~ / Content/Images. В другом столбце вы можете сохранить имя файла, а затем объединить эти два столбца, чтобы получить путь к файлу.

Если вы не хотите конкатенировать, то просто сохраните ~ / Content/Images/< image>. png в этом столбце. На ваш взгляд, то вы должны использовать &ЛТ;ИМГ СРЦ='@URL-адрес.Содержание("~/Содержание/образы/&ЛТ;изображения&ГТ;.формат PNG")' /&ГТ; для просмотра этого файла.

Отображение файла таким образом устранит необходимость в диске d:\ на системном компьютере, на котором будет развернуто это приложение.

tahirraza21

Звучит хорошо.Попробую и эту логику. Может у PLZ понятно еще одна вещь, что б синтаксисом Razor тогда?
@URL-адрес.Содержание(пункт.путь_к_образу)?? Или (item. image_path+image_name)

David_Wimbley

Если вы решите хранить весь файл в одном столбце, ваш синтаксис будет следующим

&ЛТ;ИМГ СРЦ="@URL-адрес.Содержание(Модель.путь_к_образу)" /&ГТ;

Если вы решите хранить каталог (~/Content/Images/) и файл (myimage.png) в двух разных столбцах. Ваш синтаксис будет следующим

< img src= "@Url. Content(Model.image_path + Model. image_name) " />

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

tahirraza21

я обновил контроллер:
var path = путь.Комбайн (Сервер.MapPath ("~/Content/Img"), myfile);
но он все равно сохраняет весь каталог
D:\VS 2013\BusinessClass2\BusinessClass2\Content\Img\picture(res). jpg
ввиду им с помощью цикла foreach, как я также извлечения других данных тоже
@по каждому элементу (ВАР деталь в модели) {
<tr>
< td>
@Html. DisplayFor(modelItem = & gt; item.Emp_name)
< / td>
< td>
&ЛТ;ИМГ СРЦ="@URL-адрес.Содержание(пункт.Emp_image)" высота="150" ширина="140" стиль="границы:твердых" /&ГТ;
< / td>
все еще не работает,это выглядит просто, но я новичок в MVC

David_Wimbley

Ваша проблема заключается в том, что ваша база данных / где бы она ни хранилась D:\VS 2013\BusinessClass2\BusinessClass2\Content\Img\picture(res). jpg. Вы не можете хранить полный путь к файлу и ожидать, что он появится там, где должен быть.

В базе данных вы храните ~/содержание/ИМГ/изображения(ВИЭ).JPG или D:\VS 2013\BusinessClass2\BusinessClass2\контент\Гуи\картинка(ВИЭ).формат JPG.

Вы упомянули, что просматриваете источник, и он указывает на D:\VS 2013\BusinessClass2\BusinessClass2\Content\Img\picture(res). jpg, что наводит меня на мысль, что вы неправильно храните значение в своей базе данных. В этом конкретном случае вы должны хранить ~ / Content/Img/picture(res). jpg в своей базе данных, если храните местоположение изображения в одном столбце.

Помните, что у меня нет доступа к вашему жесткому диску, поэтому я не вижу точной причины/проблемы, с которой вы столкнулись, но то, что я указал вам в направлении этого, - это путь.

Мое предложение состоит в том, чтобы разбить это на более мелкие части, чтобы выяснить, в чем заключается истинная проблема.

1) Возьмите изображение, поместите его в каталог Content/Image вашего проекта mvc. Получите это изображение для рендеринга в виде, загрузив его в модель с вашего контроллера. Визуализируйте его через < img src= "@Url. Content(Model. myimage) " />.
2) Как только вы получили 1) работу, затем возьмите образец из вашей базы данных и жестко Закодируйте его в свой контроллер. Просматривая эти значения с вашего контроллера аналогично тому, что вы опубликовали, посмотрите, отображаются ли они.
3) затем реализовать из базы данных.

Если шаги 1, 2 работают, а Шаг 3-нет. Проблема заключается в том, как вы храните значения в базе данных. Нет никаких причин, по которым шаги 1 и 2 не должны работать, если только это не проблема с правами на вашем компьютере (то есть IIS не имеет доступа к каталогу или тому, что не является возможным после развертывания).

tahirraza21

Thnx man..1 и 2 работают отлично.на мой взгляд, я делаю что-то не так в контроллере,так что плз взгляните(точный код)
[HttpPost]
public ActionResult Create(файл HttpPostedFileBase)
{
imagepath img = new imagepath (); / / таблица содержит детали изображения
allowedExtensions ВАР = новый[] {".Форматы jpg", ".файл PNG", ".форматах JPG, формате JPEG" };

рис.imagee = файл.ToString (); / / полный url-адрес
ВАР имя = путь.GetFileName(файл.FileName); / / только имя файла
ВАР ВН = путь.GetExtension(файл.Имя файла); / / расширение
if (allowedExtensions.Содержит (ext)) / / проверка расширения
{
string name = Path. GetFileNameWithoutExtension(fileName); / / имя файла без расширения
строка myfile = name + ext;
var path = путь.Комбайн (Сервер.MapPath ("~/Content/Img"), myfile);
рис.imagee = путь;
параметр obj.imagepaths.Добавить (img);
obj. SaveChanges();
файл.SaveAs(путь);
return RedirectToAction ("создать");
}
ещё
{
ViewBag. message = " Пожалуйста, выберите только файл изображения";
}
возвращение смотреть();

David_Wimbley

Покажите мне ваш код в поле зрения/что говорит ваша модель. Я думаю, что вижу проблему, но мне нужно знать, что делает вид.

tahirraza21

Смотреть:
< table class= "таблица">
<tr>
< th>
@HTML-код.DisplayNameFor(модель =&ГТ; модель.imagee)
< / th>
< th>
@HTML-код.DisplayNameFor(модель =&ГТ; модель.название)
< / th>
в <ом&ГТ;&ЛТ;/й&ГТ;
< / tr>

@по каждому элементу (ВАР деталь в модели) {
<tr>
< td>

&ЛТ;ИМГ СРЦ="@URL-адрес.Содержание(пункт.imagee)"/&ГТ;
< / td>
< td>
@Html. DisplayFor(modelItem => item.name)
< / td>

< / tr>
}

< / Таблица>
Модель:
пространство имен PathInDatabase
{
использование системы;
использование системы.Коллекции.Общий;

общественный разделяемого класса, продуктам
{
public int id { get; set; }
public string imagee { get; set; }
public string name { get; set; }
}
}

David_Wimbley

Итак, первая причина, по которой я запутался, по вашему мнению, у вас должно быть объявление @model imagepath. Я предполагаю, что этого просто не хватает.

Второй. В вашем контроллере я не вижу, чтобы вы передавали модель обратно в представление. Все что я вижу это перенаправление

return RedirectToAction ("создать");

Третий. Если бы все вышеперечисленное работало так, как задумывалось. Мне кажется, я вижу, что вы используете местоположение загруженного файла из HttpPostedFileBase в качестве значения imagee в вашем представлении. Я создал этот фрагмент на gist и добавил комментарии с примечаниями.

В вашем контроллере есть вещи,которые не обязательно складываются. Но я собираюсь предположить, что они все работают. Как бы то ни было, я считаю, что ваша проблема связана со значением img.imagee, которое вы устанавливаете.

https://gist.github.com/dwimbley/1451a58e32576beb73c960fb5f436ed1

tahirraza21

Thnks alot, я так благодарен за всю вашу поддержку.

David_Wimbley

Рад слышать, что все получилось. Если у вас есть какие-либо другие вопросы, я с радостью помогу.

tahirraza21

Как я уже говорил ранее, MVC является для меня новым, приходящим frm Classic ASP.Я создаю небольшие проекты, такие как сохранение виртуальных свойств, изображений в БД,как обрабатывать каскадный выпадающий список, значения флажков и т. д. сталкиваюсь с проблемами, но изо всех сил стараюсь преодолеть эти проблемы, ища и читая различные блоги таких людей, как вы :-)

tahirraza21

Привет, Дэвид, я застрял в бессмысленном сценарии, но я знаю, что ты можешь вытащить меня из него.
*Можно ли вставить несколько путей изображения в один столбец в БД..
т. е. ID | Name | Image_Path
1. Азбука. Множественный. ImgPaths
* извлечение всех путей изображения
Мне не нужен описательный код, просто скажите мне способ, чтобы я мог справиться с этой странной ситуацией.

David_Wimbley

Итак, вы хотите хранить несколько изображений в одной строке базы данных? Или вы хотите знать схему хранения нескольких изображений в одном столбце?

Я бы предложил хранить 1 изображение в строке. Итак, один столбец-несколько строк.

То, как вы это сделаете, это что-то вроде


Объявить @изображений таблице (
Id INT IDENTITY (1,1) NOT NULL PRIMARY KEY,
ImagePath varchar(255) NULL
);

Вставить в @Images (ImagePath) значения ('c:\path\to\image\1.png');
Вставить в @Images (ImagePath) значения ('c:\path\to\image\2.png');
Вставить в @Images (ImagePath) значения ('c:\path\to\image\3.png');
Вставить в @Images (ImagePath) значения ('c:\path\to\image\4.png');
Вставить в @Images (ImagePath) значения ('c:\path\to\image\5.png');

Есть смысл?

Затем в вашем коде, если вы используете entity framework. Вы бы получили доступ к нему с помощью

foreach (var image in context.Изображения)
{
var mypath = изображение.Продуктам;
}

Это то, что вы искали?

tahirraza21

Таблицы у меня есть :
Клиент (содержит основную информацию)
TaskDetail (TaskID, CustomerID, здесь я хочу сохранить изображения, предоставленные клиентом). Это означает, в одной строке несколько путей изображения могут быть вставлены,что оно может быть 1 путь или 2, или может больше чем 2
Примечание: возможность загрузки нескольких изображений через FileUpload является динамической ,

David_Wimbley

Итак, если я правильно вас понял, вы хотите хранить несколько изображений в одном ряду.

Поэтому отвечу на ваш вопрос так, как вы его задали. Вы должны сохранить файлы в один столбец, используя разделитель...что-то вроде символа трубы - > | или две стрелки <<. Таким образом, несколько путей изображения в одной строке будут выглядеть следующим образом c:\path\to\image1.png/c:\path\to\image2.png.

Оттуда вы бы воспользовались .Раскол в C#. так бы и сделали.

foreach (var item in context. Customer)
{
var images = item.Продуктам.Сплит('|');

foreach(var img in images)
{
// Сделайте что-нибудь со своими изображениями здесь.
}
}

Это то, что вы искали?

Однако я бы не советовал этого делать. Хранение нескольких изображений в одной строке указывает на необходимость корректировки схемы. Что-то вроде

Объявить таблицу @Customer (
Идентификатор ИНТ нуль,
Идентификатор_задачи ИНТ нуль,
)

Объявить @изображений таблице (
Идентификатор ИНТ нуль,
CustomerId INT NOT NULL,
ImagePath varchar(255) NULL
);


Таким образом, вы можете иметь 1 одно изображение на строку в вашей таблице @Images с большим количеством различных изображений, которые ссылаются на 1 клиента. Отношение 1 ко многим.

tahirraza21

Оооо да отношение 1 ко многим точно, что я понимаю :
Клиент(CusID, базовая информация )
Задача (TaskID,CusID, Detail)
Картинки (ImgID,мышипуть_образаи Идентификатор_задачи)
Вы хотите, чтобы я пошел с этой схемой?

David_Wimbley

Эй, тахирраза21, я полагаю, твои коллеги с ОП?

Во всяком случае, да, если ваша ссылка идет от задачи к изображению, то исправьте свой внешний ключ здесь TaskId.

Это был бы лучший способ решить вашу проблему, как я ее понимаю. Но также делайте то, что соответствует вашим потребностям. Если это делается с нуля,и Вы тоже можете это сделать, то нормализация вашей БД - лучший путь. Если вы застряли и должны сделать это в одном столбце, то то, что я упоминал выше с разделением строки, является одним из вариантов сделать то, что вам нужно.

tahirraza21

Хорошо, если я пойду с этой схемой, то могу ли я сохранить несколько путей изображения в разных строках одним щелчком мыши?

Я не понял, о чем ты спросил?
- Эй, тахирраза21, я полагаю, твои коллеги с ОП?"

David_Wimbley

Я просто сказал, что разговаривал с членом 9468137, оригинальным плакатом этого вопроса, а потом вы появились. Я просто подумал, что вы могли бы работать вместе.

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

Код psuedo для этого будет выглядеть примерно так


var task = новая задача();
_repo.Сохранить(задача);

// Получить идентификатор задачи для привязки ко всем загружаемым файлам/изображениям
ВАР идентификатор_задачи = задача.Идентификатор;

foreach(var file in files)
{
var img = новое изображение();
НВФ.Идентификатор_задачи = идентификатор_задачи;
НВФ.Путь = файл.Путь;
_repo.Сохранить(рис);
}

Затем, чтобы запросить ваши изображения, используя эту схему, вы бы сделали это.

Выберите * из задач в качестве
Присоединяйтесь изображений А Б О Б. Идентификатор_задачи = А. Идентификатор_задачи

Таким образом, вы получите дубликаты элементов задачи из-за отношения "один ко многим" между задачей и изображениями.

Пример: если задача 1 имеет 3 изображения, она будет отображаться 3 раза в этом запросе, но на самом деле она отображается 3 раза из-за того, что к ней привязаны 3 изображения.

tahirraza21

Я тот же самый человек, который обновил свой профиль.похоже, сработает и гораздо более понятный сценарий.
Thanx David я собираюсь попробовать это

David_Wimbley

Ну ладно, звучит неплохо. Пожалуйста. Не стесняйтесь писать мне по адресу dwimbley at outlook.com. Замените at на @. Я буду счастлив помочь вам, как только смогу.

tahirraza21

Это круто ... еще раз спасибо Дэвид :)