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

13

我想要一种方法(最好是简单易行的方式),可以在另一个文件服务器上创建下载链接。

情况如下:我正在开发的应用程序(使用asp.net 2.0,在vb.net中,但我在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)
由于显而易见的原因,它不起作用。以前设置为将文件写入应用程序路径本身,这完美地运行,但这不是好习惯,这就是我正在更改它(或者试图更改它)的原因。 我阅读了有关创建下载页面,然后在您的DB中拥有一个包含链接并返回适当的Web URL以进行下载的表格的解决方案,但不幸的是,我面临的时间限制不允许我开发它。 假设我可以提供一个包含文件的完整文件路径的字符串,那么最简单的方法是什么,只需创建一个链接,当单击该链接时,它会下载文档? 注意:我在此环境中没有管理员权限。这确实没有帮助我。假设我像上面那样得到了正确的链接,并具有适当的文件访问权限等。 更新: 上面的示例在IE中有效,但在Firefox和Chrome中无效。 IE将其转换为file://servername/…链接,这是它应该执行的操作,但FF和Chrome都决定这是不安全的,并已从其浏览器中禁用它。
4个回答

21

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


好的,我已经让处理程序正常工作了,但是在 Response.WriteFile 中它一直给我报错。我输入形如 "\server\folder\file.txt" 的字符串,然后就会得到以下错误信息: Failed to map the path '/server/folder/file.txt',我尝试了所有可能的文件。 对于这个问题有什么经验吗? - Flater
你可以像第一个链接那样传递参数,例如file=abc.txt,file=otherfile.txt等。因此,您将动态获取文件名并将它们传递给ASHX文件。您需要ASHX文件,这样您就可以让用户从那里(您的域)下载它,而不是使用在客户端上不存在的服务器路径(如果它不在局域网中)。 - wasimbhalli
好的,忽略我之前的帖子,我可以直接放弃Server.Mappath然后它就可以工作了 :) 最终确定还有点模糊,但你已经帮了我很多!谢谢! - Flater
我无法在弹出窗口中使此链接工作。不知道为什么 Response.Write 没有任何作用。 - jitendragarg
2
这个解决方案对我很有效,只是我使用的是Response.TransmitFile而不是Response.WriteFile,因为它更适合大文件。 - digital.aaron

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();

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();
}

虽然正确,但这个答案和我在将近两年前标记为解决方案的那个完全一样。 - Flater

-1

\\servername\folder1\folder2\folder3\... 是一个 UNC 路径,无法从浏览器中使用。因为文件在另一台服务器上,所以您需要一个形如 http://server-name/folder1/folder2/file.txthref 属性。

如果客户端无法解析 server-name,则需要先获取服务器的 IP 地址,然后制定形如 http://10.1.1.30/folder1/folder2/file.txt 的 href。

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

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

编辑:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接