如何使用.Net WebClient下载包含特殊字符的文件的文件

时间:2015-05-08 15:49:25

标签: c# .net asp.net-mvc-3

我在使用.Net WebClient下载包含某些字符的文件名时收到错误“400 - Bad Request”:

例如,如果文件名为:5L1XQE6FTest #.mp4;这会产生错误。

如果我删除#符号,则文件下载正常:

这是我的代码:

public ActionResult DownloadVideoFile(string filepath)
{
    try
    {              
        filepath = "http://localhost:1832/VideoUploads/" + filepath;
        var type = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
        var path = Path.GetFileName(filepath);

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

    return null;    
}

我无法控制我尝试下载的文件名,因为文件是用户提交的。

当我对文件进行Url编码时,我收到“无法找到文件”错误:

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

以下是URL编码后的路径:

  

C:\ Program Files(x86)\ IIS Express \ http%3a%2f%2flocalhost%3a1832%2fVideoUploads%2f5L1XQE6FTest +%23.mp4'

如何在下载包含特殊字符或保留字符的文件时解决错误请求错误?

2 个答案:

答案 0 :(得分:1)

您的代码中的哪一点实际上是异常引发的异常? WebClient下载任何有效命名的资源应该没有问题(有效,因为它实际上用作URL)。如果您尝试使用的URL实际上是有效的URL(因为文件名很奇怪),对URL进行编码可能足以解决问题。

但是,您之后也将错误的文件名用作File的参数,这可能是一个坏主意。如果这是引发异常的地方,那么只需构建自己的文件名而不会出现有问题的字符就足以解决问题了。

答案 1 :(得分:0)

请用#23替换#,它将起作用。