欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET实现文件的上传和下载

程序员文章站 2022-07-05 23:15:55
  最近做的一个高校网站中涉及到了上传和下载文件的需求(具体需求为:网站公布的通知,在后台要能给每个通知添加附件,在前台要能显示并下载附件),之前只是学习过关于上传的理论,这里探索了一下下...

 

最近做的一个高校网站中涉及到了上传和下载文件的需求(具体需求为:网站公布的通知,在后台要能给每个通知添加附件,在前台要能显示并下载附件),之前只是学习过关于上传的理论,这里探索了一下下,与大家分享一下成果。

事先说明:这个例子采用的是简单的三层结构,层与层之间是用实体来传值。而且这种方法不但在本地测试时可以成功,并且可以部署在服务器上,供异地上传和下载文件。

 

专门做了一个表用来存储附件的相关信息:

 

字段 说明
annexid 附件id
annexname 附件名称
annexaddress 存储附件的地址
noticeid 附件所属“通知”的id

 

 

 

asp.net实现上传文件

前端

界面十分简单,只是放一个file类型的和一个按钮,并且为这个按钮添加点击事件(btnupload_click),如下图:

ASP.NET实现文件的上传和下载

代码:

 

    
    asp:button id="btnupload" onclick="btnupload_click" runat="server" text="上传">

 

 

 

后台

再就是在后台编写上传按钮点击事件upload_click里的代码,先大体说一下思路:

1、根据file类型的控件获得将要上传文件在本机的物理路径;

2、在这个物理路径中用截取字符串的方法获得文件名(第一步中取得的路径为本机的绝对路径,在服务器上是无效的,所以这里我们只需要获取文件名);

3、利用file类型的控件属性postedfile的saveas()方法将相应文件存储到服务器中指定的文件夹中。

核心代码:

 

 

 

    protected void btnupload_click(object sender, eventargs e)
        {
            //取出所选文件的本地路径
            string fullfilename = this.upload.postedfile.filename;
            //从路径中截取出文件名
            string filename = fullfilename.substring(fullfilename.lastindexof(\) + 1);
            //限定上传文件的格式
            string type = fullfilename.substring(fullfilename.lastindexof(.) + 1);
            if (type == doc || type == docx || type == xls || type == xlsx || type == ppt || type == pptx || type == pdf || type == jpg || type == bmp || type == gif || type == png || type == txt || type == zip || type == rar)
            {
                //将文件保存在服务器中根目录下的files文件夹中
                string savefilename = server.mappath(/files) + \ + filename;
                upload.postedfile.saveas(savefilename);
                page.clientscript.registerstartupscript(page.gettype(), message, <script language='javascript' defer>alert('文件上传成功!');</script>);

                //向数据库中存储相应通知的附件的目录
                bll.news.insertannexbll insertannex = new bll.news.insertannexbll();
                annexentity annex=new annexentity();     //创建附件的实体
                annex.annexname=filename;               //附件名
                annex.annexcontent=savefilename;        //附件的存储路径
                annex.noticeid = noticeid;              //附件所属“通知”的id在这里为已知
                insertannex.insertannex(annex);         //将实体存入数据库(其实就是讲实体的这些属性insert到数据库中的过程,具体bll层和dal层的代码这里不再多说)
            }
            else
            {
                page.clientscript.registerstartupscript(page.gettype(), message, <script language='javascript' defer>alert('请选择正确的格式');</script>);
            }
        }

 

 

 

 

asp.net实现下载文件

上述操作已经可以实现将一个个控件存入数据库,在数据库中存储的情况给大家截了个图:

ASP.NET实现文件的上传和下载

下面就要把这些控件在页面上显示,页面显示效果为:

ASP.NET实现文件的上传和下载

点击附件,提示下载:

ASP.NET实现文件的上传和下载

 

前台:

按照需求来说,每则发布的通知可以包含若干个附件,所一前台用了repeter控件来显示多个附件:

代码:

 

    
         
             <%--为repeter添加序号--%>
             附件:<%#container.itemindex + 1 %>       
             ><%#((model.annexentity)container.dataitem).annexname %>
             

         
     

 

 

 

后台

asp.net可以采用多种方式下载文件(详情可参考《asp.net下载文件的几种方式》),这里采用了流式的下载方式(参考文章《asp.net下载实例》):

 

 using system.io;
    protected void lbtndownload_command(object sender, commandeventargs e)
        {
            // 定义文件名  
            string filename = ;
            // 获取文件在服务器的地址  
            string url = e.commandargument.tostring();

            // 判断传输地址是否为空  
            if (url == )
            {
                // 提示“该文件暂不提供下载”  
                page.clientscript.registerstartupscript(page.gettype(), message, <script defer>alert('该文件暂不提供下载!');</script>);
                return;
            }
            // 判断获取的是否为地址,而非文件名  
            if (url.indexof(\) > -1)
            {
                // 获取文件名  
                filename = url.substring(url.lastindexof(\) + 1);
            }
            else
            {
                // url为文件名时,直接获取文件名  
                filename = url;
            }
            // 以字符流的方式下载文件  
            filestream filestream = new filestream(@url, filemode.open);
            byte[] bytes = new byte[(int)filestream.length];
            filestream.read(bytes, 0, bytes.length);
            filestream.close();
            response.contenttype = application/octet-stream;

            // 通知浏览器下载 
            response.addheader(content-disposition, attachment; filename= + filename);
            response.binarywrite(bytes);
            response.flush();
            response.end();     
        }