如何让用户下载一个xml文件

时间:2009-02-25 15:08:46

标签: c# asp.net xml http-headers

我想要做的是用户选择网格上的一些字段,根据这些数据,我在Web服务器上创建一个xml文件,然后我希望用户下载它就像下载任何文件一样。但问题是,我不能使用这段代码:

Response.ContentType = "APPLICATION/OCTET-STREAM";

        // initialize the http content-disposition header to
        // indicate a file attachment with the default filename
        // "myFile.txt"
        System.String disHeader = "Attachment; Filename=\"" + fileName +
           "\"";
        Response.AppendHeader("Content-Disposition", disHeader);
        FileInfo downloadFile = new FileInfo(fileFullName);
        if (downloadFile.Exists)
        {
            Response.WriteFile(downloadFile.FullName);
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }

因为我需要让用户下载3个文件,所以标题无法识别它,我想要的是获取文件名并打开弹出窗口,用链接按钮列出文件名,然后用户可以下载它。 / p>

对于每个文件,我在运行时创建一个linkbutton并添加以下代码:

lnkProblem.Text = "Problemler dosyası";
    lnkProblem.Visible = true;
    lnkProblem.Command += new CommandEventHandler(lnkUser_Command);
    lnkProblem.CommandName = Request.QueryString["fileNameProblems"];
    lnkProblem.CommandArgument = Request.QueryString["fileNameProblems"];

然后使用此功能让用户下载:

void lnkUser_Command(object sender, CommandEventArgs e)
{
    Response.ContentType = "APPLICATION/XML";

    System.String disHeader = "Attachment; Filename=\"" + e.CommandArgument.ToString() +
       "\"";
    Response.AppendHeader("Content-Disposition", disHeader);
    FileInfo downloadFile = new FileInfo(Server.MapPath(".") + "\\xmls\\" + e.CommandArgument.ToString());
    if (downloadFile.Exists)
    {
        Response.WriteFile(Server.MapPath(".") + "\\xmls\\" + e.CommandArgument.ToString());
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
    HttpContext.Current.ApplicationInstance.CompleteRequest();
}

应用程序创建了xml文件,但在某处,app将html标记放在该xml文件中,因此无法打开文件,无论如何都要这样做吗?也许还有其他任何例子......

2 个答案:

答案 0 :(得分:3)

将文件发送到客户端的cleaneast方式是使用这样的TransmitFile方法:

FileInfo file = new FileInfo(filePath); // full file path on disk
Response.ClearContent(); // neded to clear previous (if any) written content
Response.AddHeader("Content-Disposition", 
    "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "text/xml"; //RFC 3023
Response.TransmitFile(file.FullName);
Response.End();

对于多个文件,一个常见的解决方案是将所有文件打包到一个zip文件中并发送它们(在这种情况下,mime类型将是application / zip)。

答案 1 :(得分:1)

创建一个单独的IHttpHandler,它只会提供您希望用户下载的文件,并Redirect创建lnkUser_Command中的该处理程序。