如何在MVC控制器中将参数传递给方法时阻止Url编码

时间:2015-03-08 21:46:02

标签: c# html asp.net-mvc

C#Web MVC + Angular

我的网页上有以下链接:

<a ng-show="channel.ArtistImagepath != null" ng-href="/channel/DownloadImageFile/?filepath={{channel.ArtistImagepath}}" target="_blank"><i class="fa fa-download" style="color: green"></i> Artist Image</a><br/>

当我在浏览器中复制链接时,它是:

//mysite/channel/DownloadImageFile/?filepath=ChannelUploads/b51535d5-4ea3-45ae-bda4-332a0ce19ee8Artist+Gomez.jpg

当我点击链接时,发送到我的控制器的文件路径是: ChannelUploads / b51535d5-4ea3-45ae-bda4-332a0ce19ee8ArtistDina Gomez.jpg

正如您所看到的,+符号被文件名中的空格替换,因为URL已经过编码。这导致找不到文件错误消息..我服务器上存在的实际文件名是:b51535d5-4ea3-45ae-bda4-332a0ce19ee8Artist + Gomez.jpg

public ActionResult DownloadImageFile(string filepath)
{
    filepath = "https://marvment.com/" + filepath;

    var type = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
    var path = Path.GetFileName(filepath);

    path = HttpUtility.UrlEncode(path);
    //path = ToUrlFriendlyString(path);

    using (var client = new WebClient())
    {
        var buffer = client.DownloadData(filepath);
        return File(buffer, type.ToString(), path);
    }
}

如何在将文件名发送到控制器之前阻止文件名进行beign URL编码? 我想在文件名中保留+号并在我的MVC控制器中处理编码。

1 个答案:

答案 0 :(得分:1)

  

如何防止文件名在发送前进行beign URL编码   它到我的控制器?

实际上它与您需要做的完全相反:确保您的URL参数(文件名)在首先被提供给浏览器之前进行了URL编码。在这种情况下,这应该在Angular中完成;见How to generate url encoded anchor links with AngularJS?

您无法在控制器操作中正确解决此问题,因为当操作获取文件名时,它已自动为您解码。