【问题标题】:Create a link to a file containing the percentage sign创建指向包含百分号的文件的链接
【发布时间】:2013-03-19 09:15:44
【问题描述】:

我正在用 C# 创建一个 MVC3 Web 应用程序。 我必须实现一个搜索屏幕来显示来自 SQL 数据库的数据以及与这些数据对应的图片。 在我的详细信息页面中,我创建了一个指向该文档的链接:

        @{
        string fullDocumentPath = "~/History/" + Model.PICTURE_PATH + "/" + Model.PICTURE_NAME.Replace("001", "TIF");
    }
    @if (File.Exists(Server.MapPath(fullDocumentPath)))
    {
        <a href="@Url.Content(fullDocumentPath)" >Click me for the invoice picture.</a>
    }

问题在于创建文档(并在数据库中添加对其路径的引用)的系统选择在许多文件名中使用 %。 当我有这个链接时:http://localhost:49823/History/044/00/aaau2vab.TIF 没关系。创建此链接时:http://localhost:49823/History/132/18/aagn%8ab.TIF 失败并显示:

The resource cannot be found. 
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.
Requested URL: /History/132/18/aagn�b.TIF

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    您尝试访问的 URL 不是 URL 编码的。您只能使用 ASCII 字符,因此对于特殊字符,您需要对路径进行 UrlEncode。您可以看到这些字符的列表,以及此列表中对应的 ASCII 字符:

    http://www.w3schools.com/tags/ref_urlencode.asp

    您可以使用 UrlEncode 方法将路径字符串转换为 URL 编码:

    http://msdn.microsoft.com/en-us/library/zttxte6w.aspx

    如果你想再次解码,可以使用UrlDecode方法:

    http://msdn.microsoft.com/en-us/library/6196h3wt.aspx

    【讨论】:

    • 据我了解,不仅数据库中的名称,而且文件系统中的文件的名称都带有 % ,所以如果您尝试解码名称,您最终会得到错误的名称。
    • 在数据库中,我的文件的路径在一列(如“132/21”)中,文件名在另一列中(如“aagn%8ab.001”)。所以,没有要先解码的 url。
    • @Dima,你是对的。我已经相应地更新了我的答案,但现在它与你的答案基本相同:)
    • @User2185692,您应该只在您的Model.PICTURE_NAME 上使用 UrlEncode 方法 - 但请记住在将 001 替换为 TIF 之后执行此操作。
    • 文件名是 aagn%8ab.TIF 但编码后是 aagn%258ab.TIF。因此找不到。有没有办法告诉 url 不要解释这个符号而只是把它当作普通字符来读取?
    【解决方案2】:

    使用Url.Encode() 方法转义特殊字符:

    @{
       string documentDirectoryPath = "~/History/" + Model.PICTURE_PATH + "/";
       string documentName = Model.PICTURE_NAME.Replace("001", "TIF");
    }
    @if (File.Exists(Server.MapPath(documentDirectoryPath + documentName)))
    {
      <a href="@Url.Content(documentDirectoryPath + Url.Encode(documentName))" >Click me for the invoice picture.</a>
    } 
    

    【讨论】:

    • 它会创建类似http://localhost:49823/BusinessCaseHistory/Details/~%2fHistory%2f132%2f18%2faagn%258ab.TIF 的内容,这会导致 HTTP 错误 400 - 错误请求。
    • 对,那么您只需对字符串的名称部分进行编码
    • 这次它给了我http://localhost:49823/History/132/18/aagn%258ab.TIF,然后是 HTTP 错误 400 - 错误请求。如果文件名被更改,则无法找到它。我担心我必须重命名数据库中的所有文件和记录(大约 402k)。
    猜你喜欢
    • 2013-05-06
    • 2019-07-15
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多