一、单文件上传
控件:
FileUpload - 控件,界面+方法+属性
Button/LinkButton/ImageButton
FileUpload控件:
1.SaveAs("要上传到服务器的绝对路径") 方法:上传文件。
般需要使用Server.MapPath()进行相对路径与绝对路径之间的转换。
protected void Button1_Click(object sender, EventArgs e) { string path = Server.MapPath("Upload/aaa.txt");//需要路径映射 FileUpload1.SaveAs(path); }
2.FileName属性:要上传文件的纯文件名,不带路径。
问题:所有上传文件都叫aaa.txt。如何保持文件原有的名子?
优化一:使用FileUpload的FileName属性,获取出上传文件的客户端的名子。
protected void Button1_Click(object sender, EventArgs e) { string filename = FileUpload1.FileName; //取得文件上传之前在客户端的名字 string path = Server.MapPath("Upload/"+ filename); FileUpload1.SaveAs(path); }
优化二:不同用户,在同一时间传相同的文件名,在文件名中使用用户名加以区分:
//新建一个登录界面 protected void Button1_Click(object sender, EventArgs e) { //若用户登陆成功,跳转到上传界面 if (true) { Session["user"] = TextBox1.Text; Response.Redirect("Default.aspx"); } } //再上传界面判断 protected void Page_Load(object sender, EventArgs e) { //判断登陆用户是不是为空,如果为空跳转到登录界面 if (Session["user"] == null) { Response.Redirect("Index.aspx"); } } //上传 protected void Button1_Click(object sender, EventArgs e) { string filename = DateTime.Now.ToString ("yyyyMMddhhmmss")+ Session["user"].ToString ()+ FileUpload1.FileName; string path = Server.MapPath("Upload/"+ filename); FileUpload1.SaveAs(path); }
优化三:扩容
在Web.Config中配置上传请求的最大长度
<system.web> <httpRuntime maxRequestLength="40960"/> </system.web>
二、 多文件上传到服务器硬盘:
思路:遍历页面Form中的每个控件,判断是否是FileUpload,如果是的话就把它强制转化为FileUpload类型,再按单文件上传逐个上传即可
protected void Button1_Click(object sender, EventArgs e) { //定义一个流水号 int i = 1; //遍历form中的每个控件 foreach (Control ctrl in this.form1.Controls ) { //ctrl对象是不是FileUpload类型 if (ctrl is FileUpload) //判断每个控件中是否选择了上传的文件 { //强制转换为FileUpload类型 FileUpload file = (FileUpload)ctrl; if (file.HasFile) { //取出文件名 string filename = DateTime.Now.ToString("yyyyMMddhhmmss") + i.ToString("0000") + file.FileName; string path = Server.MapPath("Upload/" + filename); file.SaveAs(path); i++; } } } }
三、上传文件到数据库的Image字段:
protected void Button1_Click(object sender, EventArgs e) { //把界面的数据取出来 string filename = FileUpload1.FileName;//取文件名 byte[] content = FileUpload1.FileBytes;//把上传文件的数据取出来 //送到数据库中去 Photo data = new Photo();//建一个新对象 data.FileName = filename; //上传上来的文件名 data.Content = content; //接收上传文件的数据 _Context.Photo.InsertOnSubmit(data); _Context.SubmitChanges(); }
四、从数据库中的Image字段中取出来,显示在页面上
1.选做一个显示图片的页面。例如:ShowPic.aspx.
这个页面根据传来的主键值,查询出图片数据,并Response.OutputStream显示在界面。
protected void Page_Load(object sender, EventArgs e) { if (Request["id"] != null) { string Index = Request["id"].ToString(); //读取一条Photo表的数据 var query = _Context.Photo.Where(p => p.Ids.ToString() == Index); Photo data = query.First(); byte[] pic = data.Content.ToArray(); //把二进制数据输出到界面上 Response.OutputStream.Write(pic, 0, pic.Length);//向输出流里输出二进制数据 Response.End(); } }
2.在另一个界面上,放一个Image控件,让该Image控件的ImageUrl指向上面的那个页面,并传指定的值过去。
public partial class Default3 : System.Web.UI.Page { private MyDBMDataContext _Context = new MyDBMDataContext(); //绑定数据 private void FillPic() { List<Photo> list = _Context.Photo.ToList(); DropDownList1.DataSource = list; DropDownList1.DataTextField = "FileName"; DropDownList1.DataValueField = "Ids"; DropDownList1.DataBind(); } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { FillPic(); } } protected void Button1_Click(object sender, EventArgs e) { Image1.ImageUrl = "ShowPic.aspx?id=" + DropDownList1.SelectedValue; } }