`
leonardleonard
  • 浏览: 775462 次
社区版块
存档分类
最新评论

在ASP.NET中动态修改文件下载

阅读更多

原文:http://www.c-sharpcorner.com/Code/2004/Nov/patchdownload.asp
作者:Sergey S

翻译:路亦平

地址:http://blog.csdn.net/luyiping/archive/2004/11/20/188198.aspx

在ASP.NET中动态修改文件下载


源代码:PatchDownload.zip

引言

    我们常常需要给我们的客户提供下载链接,这个链接必须允许每一个客户根据他们例如像前一步输入的帐号或其他注册信息
下载相关的文件。网页有下列接口:在第一个网页中用户必须输入用户名,而在下一个网页中我们为这个用户提供下载应用程序复本的链接。一旦用户下载应用程序并启动了它,他会看到带有他的名字的“欢迎”窗口,这个窗口由第一个网页指定。
    有很多方法可以实现这样的功能。一个方法是使用从服务器传送到客互端的用户名信息修改或重编译可下载的应用程序/包。
    这个任务可以通过简单的步骤实现它:

在ASP.NET中动态修改文件下载


源代码:PatchDownload.zip

引言

    我们常常需要给我们的客户提供下载链接,这个链接必须允许每一个客户根据他们例如像前一步输入的帐号或其他注册信息
下载相关的文件。网页有下列接口:在第一个网页中用户必须输入用户名,而在下一个网页中我们为这个用户提供下载应用程序复本的链接。一旦用户下载应用程序并启动了它,他会看到带有他的名字的“欢迎”窗口,这个窗口由第一个网页指定。
    有很多方法可以实现这样的功能。一个方法是使用从服务器传送到客互端的用户名信息修改或重编译可下载的应用程序/包。
    这个任务可以通过简单的步骤实现它:

在ASP.NET中动态修改文件下载


源代码:PatchDownload.zip

引言

    我们常常需要给我们的客户提供下载链接,这个链接必须允许每一个客户根据他们例如像前一步输入的帐号或其他注册信息
下载相关的文件。网页有下列接口:在第一个网页中用户必须输入用户名,而在下一个网页中我们为这个用户提供下载应用程序复本的链接。一旦用户下载应用程序并启动了它,他会看到带有他的名字的“欢迎”窗口,这个窗口由第一个网页指定。
    有很多方法可以实现这样的功能。一个方法是使用从服务器传送到客互端的用户名信息修改或重编译可下载的应用程序/包。
    这个任务可以通过简单的步骤实现它:

  • 将可下载的文件装载到内存。
  • 用新的值替换指定位置的指定数量的字节。
  • 结合并发送修改过的文件数据响应给客户端。        

让我们继续浏览一下每一个步骤。

定制下载过程

    为了实现可下载资源的定制动作,我们可以使用按钮或链接按钮控件,它们允许你为控件的点击动作实现服务器端代码。
    整个过程有两步组成:结合网络响应流和提供这个响应一个正确的HTTP头。服务器响应流表示要被发送至网络客户端的文件数据。为了提供给这个网络客户端传输的文件名和MIME内容类型等信息,我们必须将这些信息插入到HTTP头的字段中作为响应。
   下面的代码演示了怎样加载服务器上的文件使生成文件流,并保存到HTTP响应流中。
private void lnkDownload_Click(object sender, System.EventArgs e) {                                  
    FileStream stream = new FileStream(Server.MapPath("TestDownload.exe"), FileMode.Open,  
    FileAccess.Read, FileShare.Read);                                                                               
    try {                                                                                                                     
        int bufSize = (int)stream.Length;                                                                             
        byte[] buf = new byte[bufSize];                                                                             
                                                                                                                               
        int bytesRead = stream.Read(buf, 0, bufSize);                                                          
                                                                                                                               
        Response.OutputStream.Write(buf, 0, bytesRead);                                                     
        Response.End();                                                                                                 
    }                                                                                                                           
    finally {                                                                                                                  
        stream.Close();                                                                                                   
    }                                                                                                                           
}
    根据RFC 2616 和 RFC 1806 我们需要指出Content-Type 和 Content-Disposition 文件头字段是通过下列信息来传输二进制数据的。
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + "TestDownload.exe");
    在将数据写进HTTP响应流之前,请先写这段代码。

修改文件

    决定二进制数据需要修改的位置有些困难。如果你有一个普通的可执行应用文件在固定的位置能够包含可执行的资源或是在随机的位置包含代码。这大多数取决于你所要完成的任务并能根据不同的可下载文件作出改变。其他解决方案是用参数初始化批文件并使用定制的参数来重新编译你的应用程序或包。
    假设我们发现文件内正确的位置并且需要用用户输入的新数据替换原始内容:
private void PatchData(byte[] buf, string userName, int position) {
    byte[] patch = Encoding.Unicode.GetBytes(userName);
    System.Array.Copy(patch, 0, buf, position, patch.Length);
}
    我们同时假设文件不是很大,能够被加载到单个内存缓冲区中。
    因为可下载的可执行文件也许会经常被重新编译和替换,填充的位置也经常改变。所以不要将这些参数在ASP.NET DLL代码中进行硬编码而是将它们放入如Web.config文件中将是非常明智的。
private void lnkDownload_Click(object sender, System.EventArgs e) {
    string fileName = ConfigurationSettings.AppSettings["fileName"];
    int position = Convert.ToInt32(ConfigurationSettings.AppSettings["position"]);

    FileStream stream = new FileStream(Server.MapPath(fileName), FileMode.Open,
    FileAccess.Read, FileShare.Read);
    try {
        Response.ContentType = "application/octet-stream";
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);

        int bufSize = (int)stream.Length;
        byte[] buf = new byte[bufSize];

        int bytesRead = stream.Read(buf, 0, bufSize);

        PatchData(buf, edtUserName.Text, position);

        Response.OutputStream.Write(buf, 0, bytesRead);
        Response.End();
    }
    finally {
        stream.Close();
    }
}

源代码和运行例子

    目前实现的这个版本有一个限制——为了简化这个Demo,我们没有实现续载的功能。一旦如果你的文件大了,你也许想要改变这样的行为并增加支持续传。为了实现实现随即资源的访问功能,你需要分析文件头请求字段的范围。通过这个请求客户端指定他们需要下载的资源的字节范围。范围字段可以有1个或2个数字组成,如1024-23544。这表示客户端将要接收1024到23544字节间包含的字节数。参见Hypertext Transfer Protocol RFC文档获得更多关于网络范围请求的信息。

分享到:
评论

相关推荐

    asp.net 播放mp4视频文件代码

    asp.net 播放mp4视频文件代码 修改html中的视频mp4文件名称,即可运行,如果是部署在IIS服务器上,则需要配置IIS的MIME类型,配置步骤见内部。

    asp.net文件管理

    asp.net文件管理 对文件的增加 删除 修改

    【ASP.NET编程知识】C#.NET读取或修改文件的创建时间及修改时间详解.docx

    【ASP.NET编程知识】C#.NET读取或修改文件的创建时间及修改时间详解.docx

    Asp.Net基础可执行文件

    Asp.Net基础,详细介绍ASP.net的相关知识,从基础一步一步介绍其内容

    Dreamweaver+ASP.NET动态网站设计与典型实例

    《Dreamweaver+ASP.NET动态网站设计与典型实例》配书光盘说明 配书光盘 版权所有,侵权必究 2007年10月 一、光盘内容: 1. Readme.txt 光盘说明文件,在使用前请先读光盘的Readme.txt文件。 2.目录内容: ...

    asp.net文件上传带进度条

    asp.net文件上传带进度条 文件上传 ajax文件上传

    ASP.NET常见问题集锦.zip

    在ASP.NET程序中实现上传下载文件.doc 复合 Web 控件示例(2.0).doc 如何在ASP.Net中把图片存入数据库.txt 如何在DateTime字段里只存储日期部分?.txt 如何用.NET创建Windows服务.doc 委托与事件.doc 学生...

    asp.net文件上传示例

    自己做的asp.net文件上传示例 代码比较简单 vs2005打开直接F5运行 各位可以根据自己的需求做一些修改

    ASP.NET Core Kestrel 中使用 HTTPS (SSL)

    在ASP.NET Core中,如果在Kestrel中想使用HTTPS对站点进行加密传输,可以按照如下方式  申请证书  这一步就不详细说了,有免费的和收费的,申请完成之后会给你一个*.pfx结尾的文件。  添加NuGet包  nuget中...

    ASP.NET在线打开Office 文件实例

    ASP.NET在线打开Office 文件实例 ,简单修改一下参数就行了。

    asp.net 数据库生成XML文件

    查询数据库并保存为xml文件,根据自己的内容修改即可

    ASP.NET+jQuery 批量文件上传控件及示例程序

    这是一个ASP.NET多文件上传用户控件的源代码,另附上了控件的应用实例,加入了jQuery插件,实现了批量无刷新上传,客户端判断文件上传类型,你可以在页面中直接调用,小巧方便。实例只是为了演示,暂时只支持JPG/GIF...

    asp.net AJAX安装组件

    Validators.zip是在Bet1a,Beta2,RC中自带但在Relase中被移到ASP.NET 2.0补丁包中的AJAX兼容性Validators控件库,在新的ASP.NET2.0补丁包安装之前可以先用此库代替。具体用法祥见Scott老大的Blog ...

    ASP.NET2.0 AJAX开发组件包

    Validators.zip是在Bet1a,Beta2,RC中自带但在Relase中被移到ASP.NET 2.0补丁包中的AJAX兼容性Validators控件库,在新的ASP.NET2.0补丁包安装之前可以先用此库代替。具体用法祥见Scott老大的Blog ...

    ASP.NET的网页代码模型及生命周期

    代码隐藏页模型与单文件页模型不同的是,代码隐藏页模型将事物处理代码都存放在cs文件中,当ASP.NET网页运行的时候,ASP.NET类生成时会先处理cs文件中的代码,再处理.aspx页面中的代码。这种过程被成为代码分离。 ...

    认识ASP.NET配置文件Web.config

    Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过VB.NET新建一个Web应用程序后...

    asp.net中动态生成表格,单击进入编辑状态

    基于前台根据数据库动态生成表格,包括表头,表尾。。。页统计,全计。单元格单击编辑。唯一不足的是,数据修改完,先更新数据,然后再保存。可以自动保存。但是每次点击单元格的时候,有延迟现象。中间有段JS文件。...

    ASP[1].NET+2.0动态网站开发教程

    除此以外,书中还提供了几个典型的综合应用,如网上招聘网页的设计、以订单为中心的电子商务网站的设计等,只需对它们稍加修改即可应用于实际工作之中。.. 内容参考: 第1章 .NET框架简介. 1.1 网站发展历史的...

    ASP.NET文件上传,可上传20G以内的大文件

    ASP.NET的文件上传功能,可上传大文件,缺点就是上传大文件的时候程序加载文件的时间有点长,文件越大加载的速度就越慢,所以使用时要有耐心,对于500MB一下的文件加载还是挺快的。可自己在配置文件中修改上传文件的...

    asp.net知识库

    在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和...

Global site tag (gtag.js) - Google Analytics