2011-10-11 360 views
9

我正在寻找一种方法(轻松地,优先;))创建一个单独的文件服务器上的文件的下载链接。创建下载链接到文件服务器上的文件

情况如下:我正在开发的应用程序(asp.net 2.0在vb.net中,但我有一个类似的问题在c#中,任何解决方案适用于我)将在公司内部运行。 最好的做法是,文件存储和Web应用程序位于两台独立的服务器上。

我基本上需要能够创建一个文件的下载链接,我必须访问该文件的唯一可用URL是\ servername \ folder1 \ folder2 \ folder3 \ file.txt(可以是任何类型的文件)

Weblinks根本不起作用。这是目前如何设置:

tablerowfield.Text = String.Format(
    "<a href=""\\servername\folder1\folder2\folder3\{0}"" 
     target=""_blank"">Click me</a>", 
    filename) 

这不起作用的原因很明显。它曾经被设置为将该文件写入应用程序路径本身,并且完美运行,但这不是一个好习惯,因此我正在改变它(或试图)。

我阅读有关创建下载页面的解决方案,然后在您的数据库中拥有链接并返回适当的网址以供下载的表格,但是我遇到的时间限制令人遗憾地不允许我开发该表格。

假设我可以像上面那样提供一个带有文件路径的完整文件路径的字符串,只需创建一个单击链接即可下载文档的最简单方法是什么?

注意:我在此环境中拥有0个管理员权限。那真的没有帮助我。让我们假设我得到了正确的链接,并具有适当的文件访问权限等。

UPDATE:

上面的例子不工作在IE中,但不是在Firefox和铬。 IE将它转换为file:// servername/...链接,它可以完成它应有的功能,但是FF和Chrome都主动认定这是不安全的,并且已经从浏览器中禁用它。

回答

16

您可以使用ASHX文件(比如说,downloadfile.ashx),并使用下面的代码(没有测试,但是这将是类似的东西)在其:

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=abc.txt");            
Response.WriteFile(Server.MapPath("\\servername\folder1\folder2\folder3\abc.txt")); 
Response.End(); 

,然后在你的锚使用标签,如:

<a href="downloadfile.ashx" target=""_blank"">Click me</a> 

注意:您还可以传递参数下载不同的文件,如:

<a href="downloadfile.ashx?file=abc.txt" target=""_blank"">Click me</a> 

然后在ashx文件中使用文件名来下载相应的文件。

+0

好吧,我得到了处理工作,但它一直gving我的错误Response.WriteFile。我输入“\\ server \ folder \ file.txt”形式的字符串,我得到: 无法映射路径'/server/folder/file.txt'我尝试了每个可能的文件。 在这个问题上的任何经验? – Flater

+0

正如我已经提到的,您可以传递像file = abc.txt这样的参数作为第一个链接,file = otherfile.txt等。因此,您将动态获取文件名并将它们传递给ASHX文件。你需要ASHX文件,所以你可以让用户从那里(你的域名)下载它,而不是使用客户端不存在的服务器路径(如果它不在LAN上) – wasimbhalli

+0

好吧,不管我以前的帖子,我可以放弃服务器.Mappath,然后它的工作:)对最终确定仍然有点模糊,但你已经帮了我很多很多!谢谢! – Flater

0

\\servername\folder1\folder2\folder3\...是无法在浏览器中使用的UNC路径。由于文件位于单独的服务器上,因此需要http://server-name/folder1/folder2/file.txt格式的属性。

如果服务器名称是客户无法解决的,那么您需要首先获取服务器的IP地址,然后制定形式的href:http://10.1.1.30/folder1/folder2/file.txt

这里是你如何从IP地址服务器名称:

IPAddress[] host; 
host = Dns.GetHostAddresses("server-name"); 
string ip = host[0].ToString();   

编辑:

基本上,我需要能够创建一个下载链接到文件

使用ashx解决方案,您的应用程序将从服务器读取文件并将其转发给客户端,而不仅仅是为客户端提供一个链接,以便直接从文件服务器下载文件。

3

这段代码会在名为hi.txt的下载文件夹中创建一个文件,内容为“感谢上帝,最终下载文件”。

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=hi.txt"); 
Response.Write("thanks god, finally file got downloaded."); 
Response.End(); 
0

如果您的文件已经存在于服务器,那么你可以在你的下载按钮单击事件中使用此代码类似这样

protected void downloadpdf_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=""downloadName.pdf"""); 
    Response.WriteFile(Server.MapPath(@"~/path of pdf/actualfile.pdf")); 
    Response.End(); 
} 
+0

虽然正确,但这个答案与我在近两年前标记为解决方案*的答案完全相同。 – Flater

相关问题