【问题标题】:how to return image url instead of file path如何返回图像 url 而不是文件路径
【发布时间】:2016-10-27 12:11:44
【问题描述】:

在浏览器中显示上传的图片时遇到问题。 我收到错误

不允许加载本地资源: file:///C:/Office%20Data/dummy/AngularJSAuthentication-master/MyCars/MyCar.API/App_Data/Images/p7.jpeg%20alt=

我编写了以下代码行将图像存储在服务器上的 App_data 下。

File.Path = Url.Content(string.Format("{0}/{1}", System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Images"), fileName));

DB中保存的文件路径如下

file:///C:/Sample%20Data/dummy/AngularJSAuthentication-master/MyCars/MyCar.API/App_Data/Images/p7.jpeg

HTML

<img ng-src="{{motor.FileUploads[0].Path}} alt="Description" />

谷歌搜索后,我得到了这个错误的原因。

Basically i need to return back Image URL instead of file path.

问题: 我不确定如何将图像路径返回到角度客户端。

谁能指导我。

【问题讨论】:

  • 可以分享一下你正在使用的
  • 我已经更新了我的问题来回答你的问题。请检查。

标签: c# angularjs image url asp.net-web-api


【解决方案1】:

从浏览器引用时不需要指定完整的物理路径

File.Path = Url.Content(string.Format("~/App_Data/Images/{0}", fileName));

这应该返回相对 URL

更新:这行不通,因为您可以直接访问 app_data 文件夹的内容。你可以通过这两种方式中的任何一种来解决这个问题

  • 将图像移出 app_data 文件夹到喜欢 ~/images 文件夹 它应该可以工作或
  • 将文件保存在 app_data 文件夹中,但使用流式传输文件 您的一个控制器上的内容/文件结果操作

第二个选项的最小示例实现看起来像

public class UploadsController : Controller
{
    [HttpGet]
    public ActionResult Image( string fileName )
    {
        //!validate file name!
        return File( Server.MapPath( $"~/App_Data/{fileName}" ), "image/jpeg" );
    }
}

那么在HTML中它可以被引用为&lt;img src="api/uploads/image?filename=temp.jpg" ...

【讨论】:

  • 在这种情况下它返回“localhost:26264/App_Data/Images/p5.jpeg” 但是,浏览器仍然显示“GET localhost:26264/App_Data/Images/p5.jpeg%20alt= 404(未找到)” HTTP 错误 404.8 - 未找到 请求过滤模块配置为拒绝路径在包含 hiddenSegment 部分的 URL 中。
  • 啊!我忘记了您不能直接访问存储在 App_Data 文件夹中的文件。在这种情况下,您有两个选择。我会更新答案
  • 我已经设置了两个项目 Web Api 和 Web。所以你的意思是你的第一个解决方案是在 Web 项目或 Web Api 项目下创建 /Images 文件夹?仅供参考:App_Data/Images 在 Web Api 项目下。你如何理解我在这里的意思。
  • 好的,如果 web 和 web api 托管在不同的服务器上,那么相对 url 不适合你。因此,除了选项 1 之外,您还必须更新 ng 绑定以将 api url 附加到 img src。话虽如此,回答您的第一个问题.. 是的,在 web api 项目下创建图像文件夹(如果这是设计使然,并且您打算这样做)
  • 非常感谢。在这个阶段,我可能不会费心去理解你上面所说的两种解决方案的优缺点,但我坚持解决方案 1。即将图像文件夹移出 app_data。但是,如果您能解释第二种解决方案并更新您的答案,我将不胜感激。可能对其他读者有好处。再次感谢。
【解决方案2】:

如果您的所有图像都在Images 的根目录中,则只需删除文件名以外的所有内容:

//using System.IO;

File.Path = Url.Content(string.Format("{0}/{1}", System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Images"), Path.GetFileName(fileName)));

更新

应该像 Sam 的回答:

File.Path = Url.Content(string.Format("~/App_Data/Images/{0}",Path.GetFileName(fileName)));

【讨论】:

  • 我没有得到你太多。基本上,我的 App_Data/Images 文件夹位于 Web Api 项目下,而 Angular Client 位于不同的项目下。希望你明白我在说什么。
  • 我想我不明白。如果文件上传到AppData,这将起作用。
  • Server.MapPath 不应该给你物理位置吗? msdn.microsoft.com/en-us/library/…
  • @NikhilGirraj,是的,我回答的重点是Path.GetFileName 部分。我会更新的。
猜你喜欢
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多