如何从 API 中检索 IFormFile 并将其显示在视图中?我希望图像显示在视图中

How do i retrieve IFormFile from API and display it in view? i want the image(s) to be displayed in view

提问人:Alva Mira 提问时间:10/23/2023 最后编辑:Alva Mira 更新时间:10/25/2023 访问量:46

问:

如何从服务器端 API 成功检索 IFormFile 并将其显示在我的视图图像源中。我想知道为什么我所做的从未奏效,直到我意识到我正在使用我在返回的 JSON 中保存的路径,认为它与 mvc web 中的路径相同。请帮我检索IFormFile..我可以成功地将文件保存在服务器的文件系统中,我可以看到文件夹中的文件,然后更正路径,但不能更正文件,所以这就是我现在的问题。我的方式只是在 API 中检索文件的路径。

public async Task<IActionResult> Index()
{
    List<Room> kd = new List<Room>();
    var client = new RestClient("https://localhost:7186/api/" + "Rooms");
    var requset = new RestRequest();
    var response = client.Get(requset);
    if (response.IsSuccessStatusCode)
    {
        kd = JsonConvert.DeserializeObject<List<Room>>(response.Content.ToString());
    }
    var ListRooms = kd.ToList();
return View(ListRooms);
}

在我的模型中,我有一些属性和 IFormFIle,所以它实际上可以检索属性和 IFormFile。使用此方法,我只能获取文件的路径和其他属性。

asp.net-mvc ASP.net-core 模型视图控制器 C#-7.0

评论

0赞 Rena 10/24/2023
嗨,@Alva米拉,那么首先你的反序列化工作正常吗?只是为了确认,它包含您的房间模型中的属性类型,并且您希望将此属性显示为图像,对吗?List<Room>IFormFile
0赞 Alva Mira 10/24/2023
@Rena是的。但我的确切代码并没有从 API 中给我提供。这就是我需要的;IFormFile

答:

0赞 Rena 10/24/2023 #1

不确定你的 api 是什么样的,但是对于如何在路径已知的情况下使用 IFormFile 属性创建模型,您可以检查以下代码以创建 IFormFile:

List<Room> model = new List<Room>();
string filePath = "path_to_your_file/image.png";

using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
    // Create a FormFile object
    var file = new FormFile(stream, 0, stream.Length, null, Path.GetFileName(filePath))
    {
        Headers = new HeaderDictionary(),
        ContentType = "application/octet-stream" 
    };
    model.Add(new Room(){ImgProperty=file });//other property add by yourself...
}
return model;

反序列化工作正常后,可以创建一个扩展方法转换为 base64 字符串以显示为图像:IFormFileIFormFile

namespace MvcProj.Extension
{
    public static class FormFileExtensions
    {
        public static string ToBase64String(this IFormFile formFile)
        {
            if (formFile == null)
            {
                throw new ArgumentNullException(nameof(formFile));
            }

            using (var memoryStream = new MemoryStream())
            {
                formFile.CopyTo(memoryStream);
                byte[] bytes = memoryStream.ToArray();
                return Convert.ToBase64String(bytes);
            }
        }
    }
}

然后在“索引”视图中:

@using MvcProj.Extension;
@model List<Room>

@if(Model!=null)
{
    foreach(var item in Model)
    {
        string base64tostring = FormFileExtensions.ToBase64String(item.ImgFile);//replace with your IFormFile property
        var Imagesrc = string.Format("data:Image/*;base64," + base64tostring);
        <img src="@Imagesrc" />
    }
    
}

评论

0赞 Rena 10/25/2023
嗨@AlvaMira,如果是这样,您需要编辑您的问题并分享您的 api 是什么样的。另外,请为 api 设置断点,并使用 IFormFile 检查它是否返回正确的模型。
0赞 Rena 10/25/2023
嗨,@AlvaMira,更新了我的答案。请检查。