文件下载

      最近在忙毕业设计的事,其中,毕业设计中有一个点击一个链接就会从服务器上下载文件,我们平常在浏览网站的时候,偶尔会下载一些资料,这一下载的功能就是我要实现的。下面先说一下我的实现思路:

  1. 使用数据库,设计了一个存储文件路径的字段,把文件所在的服务器的虚拟路径存储到数据库中;
  2. 后台上传文件时,把文件拷贝到服务器的固定文件夹中,同时在数据库中添加一条虚拟存储路径的记录;
  3. 当用户在前台浏览网站时,点击相应链接,可以查到数据库中的虚拟路径,然后触发下载(保存)的事件。
HTML代码
[html]  view plain  copy
  1. <span style="font-size:18px;"><form id="form1" runat="server">  
  2.       <asp:GridView ID="gvResource" runat="server" Width="700px" AutoGenerateColumns="False">  
  3.            <Columns>  
  4.               <asp:BoundField DataField="id" HeaderText="文件编号" />  
  5.               <asp:BoundField DataField="name" HeaderText=" 文件名称" />  
  6.               <asp:BoundField DataField="type" HeaderText=" 文件类型" />  
  7.               <asp:BoundField DataField="createTime" HeaderText="创建时间" />  
  8.               <asp:BoundField DataField="remark" HeaderText=" 备注" />  
  9.               <asp:TemplateField HeaderText="资源下载" >  
  10.               <ItemTemplate>  
  11.                  <asp:LinkButton ID="lbtnDown" runat="server" OnCommand="lbtnDown_Click" CommandArgument='<%#Eval("address").ToString() %>'>下   载</asp:LinkButton>  
  12.               </ItemTemplate>  
  13.               </asp:TemplateField>  
  14.            </Columns>  
  15.   
  16.            <RowStyle HorizontalAlign="Center" />  
  17.   
  18.       </asp:GridView>  
  19. </form></span>  
界面截图
文件下载_第1张图片
CS代码
[csharp]  view plain  copy
  1. <span style="font-size:18px;">protected void lbtnDown_Click(Object sender, CommandEventArgs e)  
  2. {  
  3.     // 定义文件路径  
  4.     string url = "";  
  5.     // 定义文件名  
  6.     string fileName = "";  
  7.   
  8.     // 获取文件在服务器的地址  
  9.     url = e.CommandArgument.ToString();  
  10.     //Response.Write(e.CommandArgument.ToString());  
  11.   
  12.   
  13.     // 取得地址中的文件名  
  14.  
  15.     #region 取得地址中的文件名  
  16.     // 判断传输地址是否为空  
  17.     if (url == "")  
  18.     {  
  19.         // 提示“该文件暂不提供下载”  
  20.         Page.ClientScript.RegisterStartupScript(Page.GetType(), "message""<script defer>alert('该文件暂不提供下载!');</script>");  
  21.         return;  
  22.     }  
  23.   
  24.     // 判断获取的是否为地址,而非文件名  
  25.     if (url.IndexOf("\\") > -1)  
  26.     {  
  27.         // 获取文件名  
  28.         fileName = url.Substring(url.LastIndexOf("\\") + 1);//获取文件名  
  29.   
  30.     }  
  31.     else  
  32.     {  
  33.         // url为文件名时,直接获取文件名  
  34.         fileName = url;  
  35.     }  
  36.     #endregion  
  37.       
  38.   
  39.   
  40.     //Response.Write(fileName);  
  41.   
  42.   
  43.   
  44.     // 流方式下载文件   
  45.     #region 流方式下载文件  
  46.   
  47.     try  
  48.     {  
  49.         // 定义服务器路径  
  50.         string urlServer = Server.MapPath(url);  
  51.   
  52.         // 以字符流的方式下载文件  
  53.         FileStream fileStream = new FileStream(urlServer, FileMode.Open);  
  54.         byte[] bytes = new byte[(int)fileStream.Length];  
  55.         fileStream.Read(bytes, 0, bytes.Length);  
  56.         fileStream.Close();  
  57.         Response.ContentType = "application/octet-stream";  
  58.   
  59.         // 通知浏览器下载而不是打开  
  60.         Response.AddHeader("Content-Disposition""attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));  
  61.         Response.BinaryWrite(bytes);  
  62.         Response.Flush();  
  63.         Response.End();  
  64.     }  
  65.     catch (Exception)  
  66.     {  
  67.           
  68.     }  
  69.  
  70.     #endregion  
  71.   
  72. }</span>  
效果图
文件下载_第2张图片

      当然,我这里只是用了一种方法——流方式下载。可以实现这个功能的还有很多的方法,比如:WriteFile分块下载等等。大家有兴趣的话,可以自己去研究一下。

你可能感兴趣的:(文件下载)