拥有网页版小U盘 ASP.NET实现文件上传与下载功能
今天看到了一篇不错的文章,就拿来一起分享一下吧。
实现的是文件的上传与下载功能。
关于文件上传:
谈及文件上传到网站上,首先我们想到的就是通过什么上传呢?在ASP.NET中,只需要用FileUpload控件即可完成,但是默认上传4M大小的数据,当然了你可以在web.config文件中进行修改,方式如下:
<system.web> <httpRuntimeexecutionTimeout="240" maxRequestLength="20480"/> </system.web>
但是这种方式虽然可以自定义文件的大小,但并不是无极限的修改的
下一步,现在“工具”有了,要怎么上传呢?按照直觉是不是应该先选中我想要上传的文件呢?这就对了,因为从FileUpload控件返回后我们便已经得到了在客户端选中的文件的信息了,接下来就是将这个文件进行修改(具体的操作是:去掉所得路径下的盘符的信息,换成服务器上的相关路径下,不过这里并没有更改原本文件的名称)。然后调用相关的上传方法就好了。
先看一下界面文件吧
<formid="form1"runat="server"> <asp:FileUploadID="FileUpload1"runat="server"/> <br/> <br/> <br/> <br/> <br/> <br/> <asp:ImageButtonID="ImageButton_Up"runat="server"OnClick="ImageButton_Up_Click"style="text-decoration:underline"ToolTip="Up"Width="54px"/> <asp:ImageButtonID="ImageButton_Down"runat="server"OnClick="ImageButton_Down_Click"ToolTip="Download"Width="51px"/> <br/> <br/> <asp:LabelID="Label1"runat="server"Text="Label"></asp:Label> </form>
然后是具体的逻辑
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Web; usingSystem.Web.UI; usingSystem.Web.UI.WebControls; publicpartialclass_Default:System.Web.UI.Page { protectedvoidPage_Load(objectsender,EventArgse) { } //amethodforcurryingfileupdown privatevoidUpFile() { StringstrFileName; //getthepathofthefile StringFilePath=Server.MapPath("./")+"File"; //judgeweatherhasfiletoupload if(FileUpload1.PostedFile.FileName!=null) { strFileName=FileUpload1.PostedFile.FileName; //saveallthemessageofthefile strFileName=strFileName.Substring(strFileName.LastIndexOf("\\")+1); try { FileUpload1.SaveAs(FilePath+"\\"+this.FileUpload1.FileName); //savethefileandobeytherules Label1.Text="Uploadsuccess!"; } catch(Exceptione) { Label1.Text="UploadFailed!"+e.Message.ToString(); } } } protectedvoidImageButton_Up_Click(objectsender,ImageClickEventArgse) { UpFile(); } protectedvoidImageButton_Down_Click(objectsender,ImageClickEventArgse) { Response.Redirect("DownFile.aspx"); } }
说完了上传,下面谈一谈文件的下载。这里主要是借助于Directory对象的GetFiles()方法,其可以获得指定路径下的所有的文件的名称。这样我们就可以用之来填充一个listBox,来供我们选择到底要下载那一个文件。
也许这时你会有一点疑惑了,我现在知道了有哪些文件可以下载,那下一步我要怎么来实现呢?
其实这里是利用了Session的存储机制,那就是将我们在listbox中选择的item的内容记录到session的特定的key中,这样的话,我们就可以不用关心这些信息在页面间是怎么传输的了。只需要在想要进行下载的地方直接获取就可以了。
最为核心的是下载的过程:
if(filepathinfo.Exists) { //savethefiletolocal Response.Clear(); Response.AddHeader("Content-Disposition","attachment;filename="+Server.UrlEncode(filepathinfo.Name)); Response.AddHeader("Content-length",filepathinfo.Length.ToString()); Response.ContentType="application/octet-stream"; Response.Filter.Close(); Response.WriteFile(filepathinfo.FullName); Response.End(); }
下面看一下,下载界面的布局文件吧
<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="DownFile.aspx.cs"Inherits="DownFile"%> <!DOCTYPEhtml> <htmlxmlns="http://www.w3.org/1999/xhtml"> <headrunat="server"> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/> <title></title> </head> <body> <formid="form1"runat="server"> <asp:ImageButtonID="ImageButton_Up"runat="server"Height="56px"OnClick="ImageButton_Up_Click"ToolTip="Upload"Width="90px"/> <asp:ImageButtonID="ImageButton_Down"runat="server"Height="52px"OnClick="ImageButton_Down_Click"style="margin-top:0px"ToolTip="Download"Width="107px"/> <div> <asp:LabelID="Label1"runat="server"Text="Label"></asp:Label> <br/> <asp:ListBoxID="ListBox1"runat="server"Height="169px"OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"Width="371px"></asp:ListBox> </div> </form> </body> </html>
然后是具体的逻辑代码实现
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Web; usingSystem.Web.UI; usingSystem.Web.UI.WebControls; usingSystem.IO; publicpartialclassDownFile:System.Web.UI.Page { protectedvoidPage_Load(objectsender,EventArgse) { if(!Page.IsPostBack)//thefirsttimetoload { //getallthefileinFilefolder String[]AllTxt=Directory.GetFiles(Server.MapPath("File")); foreach(StringnameinAllTxt) { ListBox1.Items.Add(Path.GetFileName(name)); } } } protectedvoidListBox1_SelectedIndexChanged(objectsender,EventArgse) { //makeuseofsssiontosavetheselectedfileinthelistboxwiththekeyof"select" Session["select"]=ListBox1.SelectedValue.ToString(); } protectedvoidImageButton_Down_Click(objectsender,ImageClickEventArgse) { //judgeweatheruserchooseatleastonefile if(ListBox1.SelectedValue!="") { //getthepathofthechoosedfile StringFilePath=Server.MapPath("File/")+Session["select"].ToString(); //initialtheobjectofClassFileInfoandmakeitasthepackagepath FileInfofilepathinfo=newFileInfo(FilePath); //judgeweatherthefileexists if(filepathinfo.Exists) { //savethefiletolocal Response.Clear(); Response.AddHeader("Content-Disposition","attachment;filename="+Server.UrlEncode(filepathinfo.Name)); Response.AddHeader("Content-length",filepathinfo.Length.ToString()); Response.ContentType="application/octet-stream"; Response.Filter.Close(); Response.WriteFile(filepathinfo.FullName); Response.End(); } else { Page.RegisterStartupScript("sb","<script>alert('Pleasechooseonefile,sir!')</script>"); } } } protectedvoidImageButton_Up_Click(objectsender,ImageClickEventArgse) { Response.Redirect("Default.aspx"); } }
注意:
最终的上传的文件将会在根目录下的File文件夹下看到,下载的时候也是从这个文件夹下进行下载的。
总结:
经过这个小项目的实践,我看到了session给编程带来的便利,也体会到了FileUpload控件的威力;然而这并不是全部,这里仅仅是冰山一角而已,希望大家继续学习,一起进步一起提高!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。