【问题标题】:Creating download link to a file on a file server在文件服务器上创建文件的下载链接
【发布时间】:2011-12-05 06:02:43
【问题描述】:

我正在寻找一种方法来(很容易,根据偏好;))在单独的文件服务器上创建一个文件的下载链接。

情况如下:我正在开发的应用程序(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)

由于显而易见的原因,这不起作用。它曾经被设置为将该文件写入应用程序路径本身并且运行良好,但这不是一个好的做法,这就是我要更改它(或尝试)的原因。

我阅读了有关创建下载页面的解决方案,然后在您的数据库中创建一个表格,该表格包含链接并返回正确的下载网址,但不幸的是,我面临的时间限制不允许我进行开发。

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

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

更新:

上面的例子在 IE 中有效,但在 Firefox 和 Chrome 中无效。 IE 将其转换为 file://servername/... 链接,该链接完成了它应该做的事情,但 FF 和 Chrome 都积极地认为这是不安全的,并已从浏览器中禁用它。

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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”的字符串,然后我得到: 无法映射路径 '/server/folder/file.txt' 我尝试了所有可能的文件。对这个问题有什么经验吗?
    • 你可以传递像 file=abc.txt 这样的参数作为第一个链接,file=otherfile.txt 等等,正如我已经提到的。因此,您将动态获取文件名并将它们传递给 ASHX 文件。您需要 ASHX 文件,这样您就可以让用户从那里(您的域)下载它,而不是使用客户端不存在的服务器路径(如果它不在 LAN 上)
    • 好吧,忽略我之前的帖子,我可以删除 Server.Mappath,然后它就可以工作了 :) 在最终确定这一点时仍然有点模糊,但你帮了我很多!谢谢!
    • 我无法让这个链接在弹出窗口中工作。不知道为什么 Response.Write 什么都不做。
    • 这个解决方案对我有用,但我使用的是 Response.TransmitFile 而不是 Response.WriteFile,因为它更适合大文件。
    【解决方案2】:

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

    如果server-name不能被客户端解析,那么需要先获取服务器的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();
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 虽然正确,但这个答案与我在近两年前标记为解决方案的答案完全相同。
        猜你喜欢
        • 1970-01-01
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多