0

我让用户使用 asp.net 上传控件上传文件。我在列出文件的页面上有一个转发器,用户可以单击以下载它们:

    protected void grdFiles_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType != DataControlRowType.DataRow) return;

        var fileNameFull = Common.FileHelper.UploadPath + e.Row.Cells[0].Text;

        Request.MapPath(fileNameFull);

        var hyp = new HyperLink
                      {
                          NavigateUrl = fileNameFull,
                          Text = e.Row.Cells[0].Text,
                      };
        e.Row.Cells[0].Controls.Add(hyp);
    }

当文件与 Web 应用程序位于同一驱动器上时,这可以正常工作,fileNameFull 看起来像:~\Uploads\some pdf.pdf

现在的要求是将文件存储在不同的驱动器上,所以我的问题是如何实现这一点?Request.MapPath 显然需要一个虚拟路径。

这些文件需要通过网络向用户公开,安全性不是主要问题。

提前致谢。

4

3 回答 3

1

您无法创建指向不在网站内托管的文件的超链接。但是您可以创建一个 http 处理程序来提供文件。http 处理程序可以接受查询字符串中文件的标识符并将文件写入响应:

public class YourHttpHandler: IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string filePath = Common.FileHelper.UploadPath + context.Request.QueryString["file"];
        context.Response.ContentType = "your content type";
        context.Response.WriteFile(filePath);
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

然后在页面的绑定事件中,您可以将 设置NavigateUrl为处理程序,并在查询字符串中使用文件的标识符。像这样的东西:

var hyp = new HyperLink
                      {
                          NavigateUrl = "~/YourHttpHandler.ashx?file=" + e.Row.Cells[0].Text,
                          Text = e.Row.Cells[0].Text,
                      };
于 2012-08-15T05:10:24.810 回答
0

您可以创建您的自定义VirtualPathProvider,它允许您将不同的文件映射到不同的虚拟路径。

笔记

当您从 继承时VirtualPathProvider,您必须覆盖以下成员:

- FileExists
- GetFile

如果您的自定义VirtualPathProvider类支持虚拟文件系统中的目录,则必须覆盖以下成员。

- DirectoryExists
- GetDirectory
于 2012-08-15T05:03:51.890 回答
0

首先,您完全忽略了调用的结果

Request.MapPath(fileNameFull);

这是故意的吗?或者你的意思是写

fileNameFull = Request.MapPath(fileNameFull);?

其次,您需要在 IIS 中创建一个虚拟目录,该目录将映射到文件存储位置的 UNC 路径。

例如,您可以将虚拟路径映射/Uploads/到 UNC 路径\\extraserver\fileshare\uploads\

需要管理安全问题(您的网站通常在没有域访问权限的帐户中运行,因此它通常无法连接到其他服务器上的共享 - 您可以通过选择域用户来解决这个问题用于连接)。

然后忽略 Request.MapPath 路径,以及你的Common.FileHelper.UploadPath部分。

您只需提供与文件名连接的http://mywebserver/mywebsite/Uploads/部分(或者您想要制作的部分,Uploads虚拟目录路径名在哪里)。

于 2012-08-15T05:09:00.663 回答