用于从ASP.NET提供生成的文件的Boilerplate

时间:2009-08-18 19:41:32

标签: asp.net

有没有人知道可以用来从ASP.NET提供任意文件(可能是动态生成的和临时的)的基类?

我正在考虑的那种界面非常简单,看起来像这样:

class FilePage : Control // I think... 
{
    protected Filename { get; set; } // the filename to dump out
    protected bool Delete { get; set; } // Delete the (temporary) file when done?
    protected string ContentType { get; Set; } // MIME type of the file

    abstract protected void BindData();        
}

你可以从它派生,并在抽象方法中创建你需要的任何文件,设置属性并让基类处理剩下的。

我目前的用例是我想将数据导出为SQLite数据库。


编辑:

  • Superfiualy与this question相关,但我必须生成临时文件。

3 个答案:

答案 0 :(得分:2)

我不知道那样的课程,但你可以轻松写一篇。

您可以使用.aspx文件(Web表单)或.ashx文件(请求处理程序)来处理请求。在任何一种情况下,如何以非常相似的方式返回数据,使用HttpResponse对象中的属性和方法。在Web表单中,您使用Response对象的Page属性访问它,在请求处理程序中,您获得HttpContext对象作为处理请求的方法的参数Response 1}}属性。

ContentType属性设置为MIME类型,并添加一个类似"Content-Disposition"的自定义标头"attachment; filename=nameOfTheFile.ext"

有几种方法可以将数据写入响应流。您可以使用Response.Write来编写文本(将根据当前的响应编码进行编码),您可以使用Response.BinaryWrite来编写字节数组,并且可以使用Response.WriteFile来编写服务器上文件的内容。

如您所见,在将数据写入响应流之前,数据不必在文件中。除非您使用某种工具来创建必须输出到文件的数据,否则您可以完全在内存中创建响应。

答案 1 :(得分:2)

您可以创建一个“页面”作为实现IHttpHandler的类。

public abstract class FileHandler : IHttpHandler {

    protected string Sourcename  // the filename to dump out as
    protected string Filename    // the file to dump out
    protected bool   Delete      // Delete the (temporary) file when done?
    protected string ContentType // MIME type of the file

    abstract protected void BindData();

    public bool IsReusable {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context) {

        BindData();

        context.Response.ContentType = ContentType;
        context.Response.AddHeader(
            "content-disposition", 
            "attachment; filename=" + Filename);
        context.Response.WriteFile(Sourcename);

        if(Delete) File.Delete(Sourcename);
    }
}

然后您可以按照您所说的方式添加子类,以添加所需的所有功能。如果你想要处理像'删除'属性这样的事情,你也可以在那里添加一些事件。

最后,您需要更新web.config以收听正确的URL。在<httpHandlers>部分添加:

<add verb="*" path="myUrl.aspx" type="Namespace.And.Class, Library"/>

答案 2 :(得分:1)

我不知道是否有可以执行此操作的基类,但您可以清除响应头,然后将内存流写入Response.OutputStream。如果您正确设置内容类型和标题,则应该提供该文件。

示例:

Response.Clear()
Response.ClearHeaders()
Response.AddHeader("Content-Disposition", "inline;filename=temp.pdf")
Response.ContentType = "application/pdf"
stream.WriteTo(Response.OutputStream)
Response.End()