在我们的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&i-sales&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&i-sales&mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls
但是,如果我右键单击链接,选择“检查元素”,然后右键单击控制台中的锚点链接并选择“复制链接地址”,我得到:
http://localhost:2574///Prdhilfs03/l&i-sales&mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls
任何帮助或建议将不胜感激。谢谢!
修改
当我点击该链接时,我在Chrome控制台中收到此错误消息:
Not allowed to load local resource: file://Prdhilfs03/l&i-sales&mkt/WORKAREA/Agencyservices/Shared/AIC/MasterListAttachments/AF.xls
答案 0 :(得分:0)
您是否尝试使用正斜杠代替。我的意思是代替
<a href="\\Prdhilfs03\l&i-sales&mkt\WORKAREA\Agencyservices\Shared\AIC\MasterListAttachments\AF.xls" class="noLine"></a>
使用
<a href="//Prdhilfs03/l&i-sales&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也可以在这里工作,但我没有任何使用经验,所以不能在这里声明它的功效。