API图像请求问题 - URL上的FileNotFound

时间:2017-07-12 13:49:22

标签: c# asp.net-core fromfile

我要完成的目标只是从API请求图像,然后以append方法的形式将其返回到客户端。

,由于API的用户/通行证要求,我不能完全在客户端处理此问题。

,我无法在图片的src中使用@Url.Action(ImageFromPath)方法。

那就是说,这是我的后端代码:

[HttpGet("api/GetImage")]
public ActionResult ImageFromPath()
{
    string URL = "http://user:pass@MYIPADDRESS/cgi-bin/snapshot.cgi?c=1&authbasic=asdf1234";

    var srcImage = Image.FromFile(URL);
    var stream = new MemoryStream();
    srcImage.Save(stream, ImageFormat.Png);
    return File(stream.ToArray(), "image/png");
}

客户端的目标是:

$http.get('/api/GetImage').then(function (response) {
    $("#imgDiv").append('<img src="data:image/png;base64,' + response.data + '" />');
});

我遇到的问题是srcImage = Image.FromFile(URL),但错误:

  

发生了'System.IO.FileNotFoundException'类型的异常   CoreCompat.System.Drawing.dll但未在用户代码中处理

如果它有任何区别,调用API URL本身需要几秒钟才能返回Image。

任何人都可以建议正确的方法来完成这项工作吗?或者至少帮助我当前的方法有效?

编辑 - 我查看了How can I convert image url to system.drawing.image的答案,但它只提供了使用WebClient的解决方案,而ASP.Net Core尚未提供。

1 个答案:

答案 0 :(得分:1)

如果您想从网址读取文件,则需要使用 HttpClient

FilesController.cs

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace DemoWebCore.Controllers
{
    [Route("api/[controller]")]
    public class FilesController : Controller
    {
        // GET api/files/sample.png
        [HttpGet("{fileName}")]
        public async Task<string> Get(string fileName)
        {
            using (HttpClient client = new HttpClient())
            {
                HttpResponseMessage response = await client.GetAsync(
                     "https://i.stack.imgur.com/hM8Ah.jpg?s=48&g=1");
                byte[] content = await response.Content.ReadAsByteArrayAsync();
                return "data:image/png;base64," + Convert.ToBase64String(content);
            }
        }
    }
}

用法

<强> HomeController.cs

using Microsoft.AspNetCore.Mvc;

namespace DemoWebCore.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
} 

查看

<img id="sample-img" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript">
    $(function () {
        var url = "/api/files/sample.png";
        $.get(url, function (data) {
            console.log(data);
            $("#sample-img").attr('src', data);
        });
    })
</script>

您最初在做的是从文件系统中读取文件。如果该文件位于您的wwwroot文件夹中,this answer可能会对您有所帮助。