今天看到了一篇不错的文章,就拿来一起分享一下吧。
实现的是文件的上传与下载功能。
关于文件上传:
谈及文件上传到网站上,首先我们想到的就是通过什么上传呢?在ASP.NET中,只需要用FileUpload控件即可完成,但是默认上传4M大小的数据,当然了你可以在web.config文件中进行修改,方式如下:
1
2
3
4
|
<system.web> <httpRuntime executionTimeout= "240" maxRequestLength= "20480" /> </system.web> |
但是这种方式虽然可以自定义文件的大小,但并不是无极限的修改的
下一步,现在“工具”有了,要怎么上传呢?按照直觉是不是应该先选中我想要上传的文件呢?这就对了,因为从FileUpload控件返回后我们便已经得到了在客户端选中的文件的信息了,接下来就是将这个文件进行修改(具体的操作是:去掉所得路径下的盘符的信息,换成服务器上的相关路径下,不过这里并没有更改原本文件的名称)。然后调用相关的上传方法就好了。
先看一下界面文件吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
< form id = "form1" runat = "server" > < asp:FileUpload ID = "FileUpload1" runat = "server" /> < br /> < br /> < br /> < br /> < br /> < br /> < asp:ImageButton ID = "ImageButton_Up" runat = "server" OnClick = "ImageButton_Up_Click" style = "text-decoration: underline" ToolTip = "Up" Width = "54px" /> < asp:ImageButton ID = "ImageButton_Down" runat = "server" OnClick = "ImageButton_Down_Click" ToolTip = "Download" Width = "51px" /> < br /> < br /> < asp:Label ID = "Label1" runat = "server" Text = "Label" ></ asp:Label > </ form > |
然后是具体的逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { } //a method for currying file updown private void UpFile() { String strFileName; //get the path of the file String FilePath = Server.MapPath( "./" ) + "File" ; //judge weather has file to upload if (FileUpload1.PostedFile.FileName != null ) { strFileName = FileUpload1.PostedFile.FileName; //save all the message of the file strFileName = strFileName.Substring(strFileName.LastIndexOf( "\\" ) + 1); try { FileUpload1.SaveAs(FilePath + "\\" + this .FileUpload1.FileName); //save the file and obey the rules Label1.Text = "Upload success!" ; } catch (Exception e) { Label1.Text = "Upload Failed!" +e.Message.ToString(); } } } protected void ImageButton_Up_Click( object sender, ImageClickEventArgs e) { UpFile(); } protected void ImageButton_Down_Click( object sender, ImageClickEventArgs e) { Response.Redirect( "DownFile.aspx" ); } } |
说完了上传,下面谈一谈文件的下载。这里主要是借助于Directory对象的GetFiles()方法,其可以获得指定路径下的所有的文件的名称。这样我们就可以用之来填充一个listBox,来供我们选择到底要下载那一个文件。
也许这时你会有一点疑惑了,我现在知道了有哪些文件可以下载,那下一步我要怎么来实现呢?
其实这里是利用了Session的存储机制,那就是将我们在listbox 中选择的item的内容记录到session的特定的key中,这样的话,我们就可以不用关心这些信息在页面间是怎么传输的了。只需要在想要进行下载的地方直接获取就可以了。
最为核心的是下载的过程:
1
2
3
4
5
6
7
8
9
10
11
|
if (filepathinfo.Exists) { //save the file to local 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(); } |
下面看一下,下载界面的布局文件吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DownFile.aspx.cs" Inherits="DownFile" %> <!DOCTYPE html> < html xmlns = "http://www.w3.org/1999/xhtml" > < head runat = "server" > < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" /> < title ></ title > </ head > < body > < form id = "form1" runat = "server" > < asp:ImageButton ID = "ImageButton_Up" runat = "server" Height = "56px" OnClick = "ImageButton_Up_Click" ToolTip = "Upload" Width = "90px" /> < asp:ImageButton ID = "ImageButton_Down" runat = "server" Height = "52px" OnClick = "ImageButton_Down_Click" style = "margin-top: 0px" ToolTip = "Download" Width = "107px" /> < div > < asp:Label ID = "Label1" runat = "server" Text = "Label" ></ asp:Label > < br /> < asp:ListBox ID = "ListBox1" runat = "server" Height = "169px" OnSelectedIndexChanged = "ListBox1_SelectedIndexChanged" Width = "371px" ></ asp:ListBox > </ div > </ form > </ body > </ html > |
然后是具体的逻辑代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; public partial class DownFile : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { if (!Page.IsPostBack) //the first time to load { //get all the file in File folder String[] AllTxt = Directory.GetFiles(Server.MapPath( "File" )); foreach (String name in AllTxt) { ListBox1.Items.Add(Path.GetFileName(name)); } } } protected void ListBox1_SelectedIndexChanged( object sender, EventArgs e) { //make use of sssion to save the selected file in the listbox with the key of "select" Session[ "select" ] = ListBox1.SelectedValue.ToString(); } protected void ImageButton_Down_Click( object sender, ImageClickEventArgs e) { //judge weather user choose at least one file if (ListBox1.SelectedValue != "" ) { //get the path of the choosed file String FilePath = Server.MapPath( "File/" ) + Session[ "select" ].ToString(); //initial the object of Class FileInfo and make it as the package path FileInfo filepathinfo = new FileInfo(FilePath); //judge weather the file exists if (filepathinfo.Exists) { //save the file to local 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('Please choose one file,sir!')</script>" ); } } } protected void ImageButton_Up_Click( object sender, ImageClickEventArgs e) { Response.Redirect( "Default.aspx" ); } } |
注意:
最终的上传的文件将会在根目录下的File文件夹下看到,下载的时候也是从这个文件夹下进行下载的。
总结:
经过这个小项目的实践,我看到了session给编程带来的便利,也体会到了FileUpload控件的威力;然而这并不是全部,这里仅仅是冰山一角而已,希望大家继续学习,一起进步一起提高!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/marksinoberg/article/details/50365294