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



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

当我单击链接时,发送到控制器的文件路径是:频道上传/b51535d5-4ea3-45ae-bda4-332a0ce19ee8艺术家迪娜·戈麦斯.jpg

如您所见,由于 URL 已编码,因此文件名中的 + 号被替换为空格。这会导致"找不到文件"错误消息。.我的服务器上存在的实际文件名是:b51535d5-4ea3-45ae-bda4-332a0ce19ee8艺术家+戈麦斯.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);
    }
}

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

如何防止文件名在发送前被编码为良性 URL 它到我的控制器?

实际上,您需要做的恰恰相反:确保您的URL参数(文件名)在首先提供给浏览器之前已进行URL编码。在这种情况下,这应该在 Angular 中完成;请参阅如何使用 AngularJS 生成 url 编码的锚链接?

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

最新更新