有没有人知道可以用来从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数据库。
编辑:
答案 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()