MVC访问资源图片

时间:2019-03-21 15:07:03

标签: asp.net-mvc image model-view-controller asp.net-mvc-5 resources

我想从DLL /连接的项目访问并返回资源映像。

(它是一个文件,生成操作为Resource)。该属性未在属性/资源中列出,因为该文件夹中有数百个。

这个想法是我可以给图像控制器打电话。

public ImageResult Display(string resourcePath){
     Uri uri = new Uri("pack://application:,,,/ProjectName;component/Images/Vectors/" + resourcePath, UriKind.Absolute);

     // What goes here??
}

问题是我不知道如何在MVC5中将URI转换为图像。

我希望能够从视图中调用它。使用<img>标签的url属性

2 个答案:

答案 0 :(得分:0)

我认为您可以尝试WebClient.DownloadData()方法从指定的URI以字节数组的形式下载图像,然后使用Convert.ToBase64String()将其转换为Base64格式,并使用字符串在<img>标签上显示viewmodel中的属性为src属性值,以下是显示图像的示例:

视图模型示例

public class ViewModel
{
    // other properties

    // used to pass image into src attribute of img tag
    public string ImageData { get; set; }
}

控制器操作

public ActionResult Display(string resourcePath)
{
     Uri uri = new Uri("pack://application:,,,/ProjectName;component/Images/Vectors/" + resourcePath, UriKind.Absolute);

     using (var wc = new System.Net.WebClient())
     {
         // download URI resource as byte array
         byte[] image = wc.DownloadData(uri);

         // get image extension
         string path = string.Format("{0}{1}{2}{3}", uri.Scheme, Uri.SchemeDelimiter, uri.Authority, uri.AbsolutePath);
         string extension = System.IO.Path.GetExtension(path).Replace(".", "");

         // assign image to viewmodel property as Base64 string format
         var model = new ViewModel();

         model.ImageData = string.Format("data:image/{0};base64,{1}", extension, Convert.ToBase64String(image));

         return View(model);
     }
}

查看

@model ViewModel

<img src="@Model.ImageData" ... />

附加说明:

如果您已经从资源URI中知道扩展名,则可以直接使用它而不是使用Path.GetExtension,这是JPG格式的示例:

model.ImageData = string.Format("data:image/jpg;base64,{0}", Convert.ToBase64String(image));

相关问题:

Image to byte array from a url

MVC How to display a byte array image from model

答案 1 :(得分:0)

请确保注册pack://方案,因为它不会像在WPF应用程序中一样自动在MVC应用程序中注册。

在此示例代码中,Blann0是我的模型类中的公共属性,以确保在发布配置中发布代码时,不会优化对PackUriHelper.UriSchemePack属性的访问。我敢肯定,在更高版本的C#中,可以为此目的使用丢弃。

const string scheme = "pack";
if (!UriParser.IsKnownScheme(scheme))
   Blarn0 = PackUriHelper.UriSchemePack;