无法打开指向Chrome中文件的锚点链接

时间:2013-09-05 21:24:07

标签: javascript asp.net-mvc asp.net-mvc-3 google-chrome anchor

在我们的ASP MVC 3站点中,我们有一些超链接指向我们LAN上的文件(这是一个内部网站点)。这些链接总是一直工作到今天......在这一点上没有一个可以工作。在今天之前,您可以单击该链接,该文件(通常是.xlsx电子表格)将打开。

文件路径将另存为数据库中的字段。在“索引”视图中,如果此attachment字段包含内容,则在此表格单元格中使用带有回形针图像的超链接。以下是视图中的代码:

    <td>
        @if (!String.IsNullOrWhiteSpace(item.Attachment))
        {
            <a href=@item.Attachment class="noLine"><img src="@Url.Content("~/Content/Images/attachment.png")" height="20px;" width="20px;"/></a>
        }            
    </td>

以下是此HTML呈现方式的示例

<td>
    <a href="\\Prdhilfs03\l&amp;i-sales&amp;mkt\WORKAREA\Agencyservices\Shared\AIC\MasterListAttachments\AF.xls" class="noLine"></a>            
    <img src="/Content/Images/attachment.png" height="20px;" width="20px;">
</td>

如果我右键单击并复制链接地址,这就是我在剪贴板上的内容

file://Prdhilfs03/l&amp;i-sales&amp;mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls

但是,如果我右键单击链接,选择“检查元素”,然后右键单击控制台中的锚点链接并选择“复制链接地址”,我得到:

http://localhost:2574///Prdhilfs03/l&amp;i-sales&amp;mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls

任何帮助或建议将不胜感激。谢谢!

修改

当我点击该链接时,我在Chrome控制台中收到此错误消息:

Not allowed to load local resource: file://Prdhilfs03/l&amp;i-sales&amp;mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls

3 个答案:

答案 0 :(得分:0)

您是否尝试使用正斜杠代替。我的意思是代替

<a href="\\Prdhilfs03\l&amp;i-sales&amp;mkt\WORKAREA\Agencyservices\Shared\AIC\MasterListAttachments\AF.xls" class="noLine"></a>

使用

<a href="//Prdhilfs03/l&amp;i-sales&amp;mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls" class="noLine"></a>

转换网址:

var links = document.querySelectorAll("a");
for(var i=0; i<links.length; i++) {
    var link = links[i];
    var url = link.getAttribute("href");
    if(url) {
        url = url.replace(/\\/g, "/");
        link.setAttribute("href", url);
    }
}

答案 1 :(得分:0)

首先,在你的href前加上“file://”而不是“\\”,这将解决两个链接之间的差异。

其次,我认为您的问题与跨站点脚本有关。您的浏览器不希望被欺骗从其他服务器下载文件(我假设\\ Prdhilfs03是与Web服务器不同的计算机)。

要使用Chrome验证此问题,请在您的javascript控制台处于打开状态时单击该链接,然后查看是否收到类似“不允许加载本地资源:”的错误。

修改

好的,正如您的错误消息所证实的那样,您的Web浏览器阻止您从其他服务器下载文件以防止跨站点脚本。有一篇文章here介绍了通过更改Chrome设置来解决此问题的步骤,但另一个选项是将文件本地存储在Web服务器上。

答案 2 :(得分:0)

我将在Karl的回答中补充说您遇到了跨站点脚本问题。另一种方法是让控制器以FileResult的形式返回有问题的文件。我们称之为FileRouter。然后,FileRouter将有一个名为Download的操作,如下所示:

public FileContentResult Download(string path)
{
    return this.File(/* a stream to the path */);
}

然后,您可以将路径传递给控制器​​上的操作。因此,您将放置一个Html.Action链接而不是直接链接,其目标是intranetserver / filerouter / download?path = path_to_file

当然,这有一个缺点,即服务器不必要地从网络上加载文件,但它是另一种考虑因素。

此外,使用FilePathResult也可以在这里工作,但我没有任何使用经验,所以不能在这里声明它的功效。