2017-02-21 34 views
0

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

В настоящее время я использую:

@foreach (var imgPath in Directory.GetFiles("C:/Users/me/documents", "*.*")) 
{ 
    var img = new FileInfo(imgPath); 
    <img src="@Url.Content(String.Format("C:/Users/me/documents/{0}", img.Name))" /> 
} 

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

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

+0

Ваши папки должны быть относительными/виртуальными путями (с использованием 'Server.MapPath()'), а 'me' может быть сгенерирован на основе идентификатора пользователя. –

+0

@StephenMuecke Я как бы понял, но как я могу сопоставить виртуальный путь с физическим? Если я создаю новую папку в Visual Studio, она автоматически создаст путь. –

+0

Начните с создания папки в приложении для файлов, например 'Users'. Затем для каждого пользователя вы можете программно добавлять подпапки на основе того, что однозначно идентифицирует их (возможно, когда они регистрируются?). Затем вы можете использовать 'Server.MapPath()' для получения абсолютного пути к папке - 'Server.MapPath (« ~/Users/User1 »)' –

ответ

1

Url.Content Вспомогательный метод принимает путь виртуального контента к вашему файлу и возвращает URL-адрес для доступа к файлу на вашем сайте. Вы не должны передавать местоположение физического каталога.

Вы можете сохранить изображения в своем веб-приложении. Создайте каталог под названием «Изображения», а затем вы можете безопасно использовать метод Url.Content.

Например,

@foreach (var imgPath in Directory.GetFiles(Server.MapPath(Url.Content("~/Images/")))) 
{ 
    <img src="@Url.Content("~/Images/"+ @Path.GetFileName(imgPath))" /> 
} 

Или если вы абсолютно необходимо хранить изображения, где-то за пределами корня приложения (Пример: «C: \ Temp \ образы или сетевой), Вы могли бы рассмотреть вопрос о создании метод действия, который принимает имя файла, чтение файла с места и вернуть в качестве изображения.

public ActionResult GetImg(string id) 
{ 
    var path = [email protected]"C:\temp\images\{id}.png"; 
    var bytes = System.IO.File.ReadAllBytes(path); 
    return File(bytes, "image/png"); 
} 

Теперь вам нужно просто назвать эту конечную точку и использовать его в качестве свойства изображения Src.

@foreach (var imgPath in Directory.GetFiles(@"C:\temp\images", "*.*")) 
{ 
    <img src="@Url.Action("GetImg",new {id=Path.GetFileNameWithoutExtension(imgPath)})" /> 
} 

Вышеприведенное является простым решением, в котором я жестко закодировал его для возврата файлов png. вы можете обновить его, чтобы быть более гибким (добавьте параметр, чтобы принять расширение файла также)

Примечание: Я лично предпочитаю хранить минимальные C# в бритвенных файлах. Мне нравится перемещать код C# (все эти строки Directory.GetFiles) в действие GET и передавать список имен изображений в представление через модель/сумку просмотра (при необходимости).