创建文件服务器上文件的下载链接

时间:2011-10-11 11:51:45

标签: c# asp.net vb.net file download

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

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

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

网络链接根本不起作用。这是它目前的设置方式:

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

由于显而易见的原因,这不起作用。它曾经被设置为将该文件写入应用程序路径本身,并且完美地工作,但这不是一个好习惯,这就是我改变它(或尝试)的原因。

我阅读了有关创建下载页面的解决方案,然后在数据库中有一个表,其中包含链接并返回适当的Web URL以供下载,但遗憾的是,我面临的时间限制不允许我开发它。 / p>

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

注意:我在此环境中拥有0个管理员权限。这真的没有帮助我。让我们假设我得到了如上所述的正确链接,并拥有相应的文件访问权限等。

更新

以上示例适用于IE,但不适用于Firefox和Chrome。 IE将其转换为文件:// servername / ...链接,它可以实现预期,但FF和Chrome都主动决定这是不安全的,并已将其从浏览器中禁用。

4 个答案:

答案 0 :(得分:19)

您可以使用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文件中,使用文件名下载相应的文件。

答案 1 :(得分:2)

这段代码将在下载文件夹中创建一个文件,其名称为= 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();

答案 2 :(得分: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();
}

答案 3 :(得分:-1)

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

如果客户端无法解析服务器名称,则需要首先获取服务器的IP地址,然后制定表单的href:http://10.1.1.30/folder1/folder2/file.txt

以下是从server-name获取IP地址的方法:

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

编辑:

  

我基本上需要能够创建文件的下载链接

使用ashx解决方案,您的应用程序将从服务器读取文件并将其中继到客户端,而不是仅向客户端提供直接从文件服务器下载文件的链接。

相关问题