default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <mce:script type="text/javascript" language="javascript"><!-- function fileChang(fileSrc) { //获取用户选择文件的后缀名 var suffix = fileSrc.toString().substr(fileSrc.toString().indexOf("."), fileSrc.toString().length - fileSrc.toString().indexOf(".")); //判断文件是否是图片文件 if (suffix != ".gif" && suffix != ".jpg" && suffix != ".bmp" && suffix != ".png" ) { //隐藏预览图片框 document.getElementById("imgPreview").style.display = "none"; //提示错误信息 document.getElementById("spnErrorMessage").innerText = "文件格式不正确,只允许上传gif、jpg、bmp、png格式的图片"; //清空上传控件 window.event.srcElement.select(); document.selection.clear(); //返回false 阻止当前表单提交 从而阻止上传非图片文件 return false; } //如果文件时图片 清空错误提示信息 document.getElementById("spnErrorMessage").innerText = ""; //设定预览图片文件路径 document.getElementById("imgPreview").src = fileSrc; //显示预览图片框 document.getElementById("imgPreview").style.display = "block"; //允许当前表单提交 允许上传图片 return true; } // --></mce:script> <mce:style type="text/css"><!-- /* = 图片显示样式(缩放图片)设定样式属性: 高度、宽度 */ .imgPerview { width:60%; height:60%; } /* = 设定Table元素的样式 设定样式属性: 字体、字体大小 */ table { font-family:黑体; font-size:9pt; } --></mce:style><style type="text/css" mce_bogus="1"> /* = 图片显示样式(缩放图片)设定样式属性: 高度、宽度 */ .imgPerview { width:60%; height:60%; } /* = 设定Table元素的样式 设定样式属性: 字体、字体大小 */ table { font-family:黑体; font-size:9pt; } </style> </head> <body> <!--表单元素使用onsubmit添加JavaScript表单验证函数,如果验证函数返回true,表单就可以提交否则表单不进行提交--> <form id="form1" runat="server" οnsubmit="return fileChang(document.getElementById('fulImage').value)"> <div style="text-align:center" mce_style="text-align:center"> <table style="width:360px;border:solid 1px blue;"> <tr> <td style="width:30%">选择图片</td> <td> <!--选择上传图片的FileUpload控件 在page_load事件中为该控件添加了验证文件格式的JavaScript函数 --> <asp:FileUpload runat=server ID="fulImage" /><br /><span id="spnErrorMessage" style="color:red;" mce_style="color:red;"></span> </td> </tr> <tr> <td style="width:30%">预览</td> <td> <!--显示图片预览的图片框--> <asp:Image runat=server ID="imgPreview" CssClass="imgPerview" style="display:none;" mce_style="display:none;" /> </td> </tr> <tr> <td style="text-align:center" mce_style="text-align:center" colspan="2"> <asp:Button runat="server" ID="btnUpload" Text="上传" οnclick="btnUpload_Click" /> </td> </tr> <tr> <td colspan="2"> <!--显示上传文件信息的GridView控件--> <asp:GridView runat=server ID="gdvFiles" AutoGenerateColumns="false" Width="100%"> <Columns> <asp:BoundField HeaderText="文件名" DataField="FileName" /> <asp:BoundField HeaderText="文件大小" DataField="FileSize" /> <asp:TemplateField HeaderText="图片预览"> <ItemTemplate> <img id="imgPreview" src='<%# Eval("FileSrc") %>' style="width:32%;height:32%;" /> <br /> <a accesskey="File" href='<%# Eval("FileSrc") %>' runat="server">下载</a> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </td> </tr> </table> </div> </form> </body> </html>
default.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using System.Data; using localhost; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { FileService.CreateFilestable(); //显示上传文件的信息 this.gdvFiles.DataSource = FileService.FilesTable; this.gdvFiles.DataBind(); //为上传文件控件添加JavaScript事件处理函数 this.fulImage.Attributes.Add("onchange", "fileChang(this.value);"); } /// <summary> /// 上传文件按钮单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnUpload_Click(object sender, EventArgs e) { FileService.CreateFilestable(); FileService fs=new FileService(); string path = fs.Upload(this.fulImage.FileBytes, this.fulImage.FileName); //显示上传文件的信息 this.gdvFiles.DataSource =FileService.FilesTable; this.gdvFiles.DataBind(); } protected void gdvFiles_RowCommand(object sender, GridViewCommandEventArgs e) { string downLoadFileName = e.CommandArgument.ToString().Substring(e.CommandArgument.ToString().LastIndexOf("//")+1); //设定响应类型为下载 this.Response.ContentType = "application/x-zip-compressed"; //获取下载文件在服务器端的物理路径 string downLoadPath = this.Server.MapPath(e.CommandArgument.ToString()); //添加响应头标示信息 this.Server.UrlPathEncode对下载文件名进行编码 防止文件名乱码 this.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", this.Server.UrlPathEncode(downLoadFileName))); //下载文件输出 /* TransmitFile方法可以保证400M以上的文件正确下载 * 所以笔者推荐使用 TransmitFile方法 */ this.Response.TransmitFile(downLoadPath); } }
./appcode/FileService.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.IO; using System.Data; /// <summary> ///FileService 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] //若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class FileService : System.Web.Services.WebService { public FileService() { //如果使用设计的组件,请取消注释以下行 //InitializeComponent(); } [WebMethod] public string Upload(byte[] bytes, string fileName) { //获取上传文件夹物理路径 string path = HttpContext.Current.Server.MapPath("Upload"); //获取重命名的文件物理路径(防止重名文件导致文件覆盖) path = MakeUniquePath(path, fileName); FileStream fs = File.Create(path); fs.Write(bytes, 0, bytes.Length); fs.Close(); fs.Dispose(); //更新存储上传文件夹中所有文件信息的数据表 UpdateFilesTable(); return path; } /// <summary> /// 组装文件物理路径,当文件路径已经存在即存在同名文件时, /// 如当前文件名为1.gif ,存在同名文件时 /// MakeUniquePath()方法会修改文件名为1[1].gif,如果还存在同名文件时,继续修改为1[2].gif /// 直到不存在同名文件 即将文件路径返回 这样就有效防止了文件覆盖。 /// </summary> /// <param name="path"></param> /// <param name="fileName"></param> /// <returns></returns> protected static string MakeUniquePath(string path, string fileName) { int i = 1; //组装文件物理路径 string filePath = string.Format("{0}//{1}", path, fileName); //获取文件名中后缀之前的字符串 string prifix = fileName.Substring(0, fileName.IndexOf(".")); //获取文件名后缀 string suffix = fileName.Substring(fileName.IndexOf(".")); //判断文件是否存在 while (File.Exists(filePath)) { //组装新文件名 fileName = string.Format("{0}[{1}]{2}", prifix, i, suffix); //组装新文件路径 filePath = string.Format("{0}//{1}", path, fileName); //判断文件是否存在 if (File.Exists(filePath)) { //如果存在即将i++自增 继续组装新文件名 i++; continue; } else { //如果文件名不存在 即跳出循环 返回新文件名 break; } } return filePath; } /// <summary> /// 将文件字节数转化为M、K等带有度量单位的字符串 /// 便于用户浏览 /// </summary> /// <param name="content">文件字节数</param> /// <returns></returns> protected static string GetFileContent(long content) { double size = 0; //判断当前文件大小是否大于1M if (content > (1000 * 1000)) { //获取M数 size = content / (double)1000 * 1000; //使用预定义格式化字符串将double转化为ddd.dd形式的字符串 return size.ToString("F") + "M"; } //判断当前文件大小是否大于1K else if (content > 1000) { //获取K 数 size = content / (double)1000; //使用预定义格式化字符串将double转化为ddd.dd形式的字符串 return size.ToString("F") + "K"; } else { return content.ToString(); } } /// <summary> /// 存放上传文件的DataTable /// </summary> public static DataTable FilesTable { get { return (DataTable)HttpContext.Current.Session["FilesTable"]; } set { HttpContext.Current.Session["FilesTable"] = value; } } /// <summary> /// 构建上传文件数据表 /// </summary> public static void CreateFilestable() { if (FilesTable == null) { //实例化数据表 FilesTable = new DataTable(); //组建文件名数据列 DataColumn fileNameCol = new DataColumn("FileName", typeof(string)); FilesTable.Columns.Add(fileNameCol); //组建文件大小数据列 DataColumn fileSizeCol = new DataColumn("FileSize", typeof(string)); FilesTable.Columns.Add(fileSizeCol); //组建文件路径数据列 DataColumn fileSrcCol = new DataColumn("FileSrc", typeof(string)); FilesTable.Columns.Add(fileSrcCol); } UpdateFilesTable(); } protected static void UpdateFilesTable() { FilesTable.Rows.Clear(); //获取上传文件夹物理路径 string path = HttpContext.Current.Server.MapPath("Upload"); DirectoryInfo dic = new DirectoryInfo(path); foreach (FileInfo f in dic.GetFiles()) { //创建存储新文件的数据行 DataRow row = FilesTable.NewRow(); //存储文件名 row["FileName"] = f.Name; //存储文件大小 row["FileSize"] = GetFileContent(f.Length); //存储文件路径 row["FileSrc"] = @"Upload/" + @f.Name; //将数据行添加到数据表中 FilesTable.Rows.Add(row); //数据表接受一切修改 FilesTable.AcceptChanges(); continue; } } }