前端页面代码:
<input id="fileUpload" type="file" runat="server" visible="false" /> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID="sBtn" runat="server" OnClick="sBtn_Click" Text="上传" Visible="false" />
使用C#实例:
/// <summary> /// 文件上传:对应FileUpload、input两种 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void sBtn_Click(object sender, EventArgs e) { #region 上传文件 urlPath = Server.MapPath("~/file/"); FileUpHelper.FileSc(FileUpload1, DateTime.Now.ToString("yyyyMMddHHmmss") + FileDownHelper.FileNameExtension(FileUpload1.FileName), urlPath); FileUpHelper.FileUpload(urlPath, DateTime.Now.ToString("yyyyMMddHHmmss") + FileDownHelper.FileNameExtension(FileUpload1.FileName), FileUpload1); byte[] by = FileUpload1.FileBytes; FileUpHelper.SaveFile(by, DateTime.Now.ToString("yyyyMMddHHmmss"), FileDownHelper.FileNameExtension(FileUpload1.FileName), urlPath); FileUpHelper.UploadFile(urlPath, 100 * 1024 * 1024, new string[4] { ".txt", ".rar", ".png", ".jpg" }, fileUpload); //100M内 string saveFileName = ""; int fileSize = 0; FileUpHelper.UploadFile(urlPath, 100 * 1024 * 1024, new string[4] { ".txt", ".rar", ".png", ".jpg" }, fileUpload, out saveFileName, out fileSize); FileUpHelper.UploadFile(urlPath, 100 * 1024 * 1024, new string[4] { ".txt", ".rar", ".png", ".jpg" }, DateTime.Now.ToString("yyyyMMddHHmmss"), fileUpload); #endregion }
类库信息:
/// <summary> /// 文件上传类(文件另存为) /// </summary> public class FileUpHelper { #region 文件流的形式进行上传操作 #region 基础信息 /// <summary> /// 转换为字节数组 /// </summary> /// <param name="filename">文件名</param> /// <returns>字节数组</returns> public static byte[] GetBinaryFile(string filename) { if (File.Exists(filename)) { FileStream Fsm = null; try { Fsm = File.OpenRead(filename); return ConvertStreamToByteBuffer(Fsm); } catch { return new byte[0]; } finally { Fsm.Close(); } } else { return new byte[0]; } } /// <summary> /// 流转化为字节数组 /// </summary> /// <param name="theStream">流</param> /// <returns>字节数组</returns> public static byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream) { int bi; MemoryStream tempStream = new System.IO.MemoryStream(); try { while ((bi = theStream.ReadByte()) != -1) { tempStream.WriteByte(((byte)bi)); } return tempStream.ToArray(); } catch { return new byte[0]; } finally { tempStream.Close(); } } #endregion #region 上传文件 /// <summary> /// 上传文件 /// </summary> /// <param name="PosPhotoUpload">控件</param> /// <param name="saveFileName">保存的文件名</param> /// <param name="imagePath">保存的文件路径</param> public static string FileSc(FileUpload PosPhotoUpload, string saveFileName, string imagePath) { string state = ""; if (PosPhotoUpload.HasFile) { if (PosPhotoUpload.PostedFile.ContentLength / 1024 < 10240) { string MimeType = PosPhotoUpload.PostedFile.ContentType; if (String.Equals(MimeType, "image/gif") || String.Equals(MimeType, "image/pjpeg") || String.Equals(MimeType, "image/png") || String.Equals(MimeType, "image/jpeg")) { string extFileString = System.IO.Path.GetExtension(PosPhotoUpload.PostedFile.FileName); PosPhotoUpload.PostedFile.SaveAs(imagePath + saveFileName); } else { state = "上传文件类型不正确"; } } else { state = "上传文件不能大于10M"; } } else { state = "没有上传文件"; } return state; } /// <summary> /// 上传文件 /// </summary> /// <param name="path">保存路径</param> /// <param name="fileName">上传后文件名</param> /// <param name="filleupload">上传文件控件</param> /// <returns></returns> public static string FileUpload(string path, string fileName, FileUpload filleupload) { try { bool fileOk = false; //取得文件的扩展名,并转换成小写 string fileExtension = System.IO.Path.GetExtension(filleupload.FileName).ToLower(); //文件格式 string[] allowExtension = { ".rar", ".zip", ".rar", ".ios", ".jpg", ".png", "bmp", ".gif", ".txt" }; if (filleupload.HasFile) { //对上传的文件的类型进行一个个匹对 for (int i = 0; i < allowExtension.Length; i++) { if (fileExtension == allowExtension[i]) { fileOk = true; break; } } } //如果符合条件,则上传 if (fileOk) { if (Directory.Exists(path) == false)//如果不存在就创建file文件夹 { Directory.CreateDirectory(path); } if (!FileHelper.IsExistFile(path + fileName)) { int Size = filleupload.PostedFile.ContentLength / 1024 / 1024; if (Size > 10) { return "上传失败,文件过大"; } else { filleupload.PostedFile.SaveAs(path + fileName); return "上传成功"; } } else { return "上传失败,文件已存在"; } } else { return "不支持【" + fileExtension + "】文件格式"; } } catch (Exception) { return "上传失败"; } } /// <summary> /// 上传文件 /// </summary> /// <param name="binData">字节数组</param> /// <param name="fileName">文件名</param> /// <param name="fileType">文件类型</param> /// <param name="savePath">保存路径</param> //-------------------调用---------------------- //byte[] by = GetBinaryFile("E:\\Hello.txt"); //this.SaveFile(by,"Hello",".txt"); //--------------------------------------------- public static void SaveFile(byte[] binData, string fileName, string fileType, string savePath) { FileStream fileStream = null; MemoryStream m = new MemoryStream(binData); try { if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } string File = savePath + fileName + fileType; fileStream = new FileStream(File, FileMode.Create); m.WriteTo(fileStream); } finally { m.Close(); fileStream.Close(); } } #endregion #endregion #region 文件通过HtmlInputFile控件上传操作 /// <summary> /// 文件进行上传 /// </summary> /// <param name="filePath">保存文件地址</param> /// <param name="maxSize">文件最大大小</param> /// <param name="fileType">文件后缀类型</param> /// <param name="TargetFile">控件名</param> /// <returns></returns> public static string UploadFile(string filePath, int maxSize, string[] fileType, System.Web.UI.HtmlControls.HtmlInputFile TargetFile) { string Result = "UnDefine"; bool typeFlag = false; string FilePath = filePath; int MaxSize = maxSize; string strFileName, strNewName, strFilePath; if (TargetFile.PostedFile.FileName == "") { return "FILE_ERR"; } strFileName = TargetFile.PostedFile.FileName; TargetFile.Accept = "*/*"; strFilePath = FilePath; if (Directory.Exists(strFilePath) == false) { Directory.CreateDirectory(strFilePath); } FileInfo myInfo = new FileInfo(strFileName); string strOldName = myInfo.Name; strNewName = strOldName.Substring(strOldName.LastIndexOf(".")); strNewName = strNewName.ToLower(); if (TargetFile.PostedFile.ContentLength <= MaxSize) { for (int i = 0; i <= fileType.GetUpperBound(0); i++) { if (strNewName.ToLower() == fileType[i].ToString()) { typeFlag = true; break; } } if (typeFlag) { string strFileNameTemp = GetUploadFileName(); string strFilePathTemp = strFilePath; float strFileSize = TargetFile.PostedFile.ContentLength; strOldName = strFileNameTemp + strNewName; strFilePath = strFilePath + "\\" + strOldName; TargetFile.PostedFile.SaveAs(strFilePath); Result = strOldName + "|" + strFileSize; TargetFile.Dispose(); } else { return "TYPE_ERR"; } } else { return "SIZE_ERR"; } return (Result); } /// <summary> /// 文件进行上传 /// </summary> /// <param name="filePath">保存文件地址</param> /// <param name="maxSize">文件最大大小</param> /// <param name="fileType">文件后缀类型</param> /// <param name="TargetFile">控件名</param> /// <param name="saveFileName">保存后的文件名和地址</param> /// <param name="fileSize">文件大小</param> /// <returns></returns> public static string UploadFile(string filePath, int maxSize, string[] fileType, System.Web.UI.HtmlControls.HtmlInputFile TargetFile, out string saveFileName, out int fileSize) { saveFileName = ""; fileSize = 0; string Result = ""; bool typeFlag = false; string FilePath = filePath; int MaxSize = maxSize; string strFileName, strNewName, strFilePath; if (TargetFile.PostedFile.FileName == "") { return "请选择上传的文件"; } strFileName = TargetFile.PostedFile.FileName; TargetFile.Accept = "*/*"; strFilePath = FilePath; if (Directory.Exists(strFilePath) == false) { Directory.CreateDirectory(strFilePath); } FileInfo myInfo = new FileInfo(strFileName); string strOldName = myInfo.Name; strNewName = strOldName.Substring(strOldName.LastIndexOf(".")); strNewName = strNewName.ToLower(); if (TargetFile.PostedFile.ContentLength <= MaxSize) { string strFileNameTemp = GetUploadFileName(); string strFilePathTemp = strFilePath; strOldName = strFileNameTemp + strNewName; strFilePath = strFilePath + strOldName; fileSize = TargetFile.PostedFile.ContentLength / 1024; saveFileName = FileHelper.GetFileName(strFilePath); TargetFile.PostedFile.SaveAs(strFilePath); TargetFile.Dispose(); } else { return "上传文件超出指定的大小"; } return (Result); } /// <summary> /// 文件进行上传 /// </summary> /// <param name="filePath">保存文件地址</param> /// <param name="maxSize">文件最大大小</param> /// <param name="fileType">文件后缀类型</param> /// <param name="filename">要保存为文件名</param> /// <param name="TargetFile">控件名</param> /// <returns></returns> public static string UploadFile(string filePath, int maxSize, string[] fileType, string filename, System.Web.UI.HtmlControls.HtmlInputFile TargetFile) { string Result = "UnDefine"; bool typeFlag = false; string FilePath = filePath; int MaxSize = maxSize; string strFileName, strNewName, strFilePath; if (TargetFile.PostedFile.FileName == "") { return "FILE_ERR"; } strFileName = TargetFile.PostedFile.FileName; TargetFile.Accept = "*/*"; strFilePath = FilePath; if (Directory.Exists(strFilePath) == false) { Directory.CreateDirectory(strFilePath); } FileInfo myInfo = new FileInfo(strFileName); string strOldName = myInfo.Name; strNewName = strOldName.Substring(strOldName.LastIndexOf(".")); strNewName = strNewName.ToLower(); if (TargetFile.PostedFile.ContentLength <= MaxSize) { for (int i = 0; i <= fileType.GetUpperBound(0); i++) { if (strNewName.ToLower() == fileType[i].ToString()) { typeFlag = true; break; } } if (typeFlag) { string strFileNameTemp = filename; string strFilePathTemp = strFilePath; strOldName = strFileNameTemp + "." + strNewName; strFilePath = strFilePath + strOldName; TargetFile.PostedFile.SaveAs(strFilePath); Result = strOldName; TargetFile.Dispose(); } else { return "TYPE_ERR"; } } else { return "SIZE_ERR"; } return (Result); } /// <summary> /// 取文件名 /// </summary> /// <returns></returns> public static string GetUploadFileName() { string Result = ""; DateTime time = DateTime.Now; Result += time.Year.ToString() + FormatNum(time.Month.ToString(), 2) + FormatNum(time.Day.ToString(), 2) + FormatNum(time.Hour.ToString(), 2) + FormatNum(time.Minute.ToString(), 2) + FormatNum(time.Second.ToString(), 2) + FormatNum(time.Millisecond.ToString(), 3); return (Result); } /// <summary> /// 格式化字符串 /// </summary> /// <param name="Num">需格式的数字</param> /// <param name="Bit">0个数</param> /// <returns></returns> public static string FormatNum(string Num, int Bit) { int L; L = Num.Length; for (int i = L; i < Bit; i++) { Num = "0" + Num; } return (Num); } #endregion } /// <summary> /// 文件下载类 /// </summary> public class FileDownHelper { #region 基础方法 /// <summary> /// 读取虚拟目录文件的文件后缀 /// </summary> /// <param name="fileName">文件虚拟路径</param> /// <returns></returns> public static string FileNameExtension(string fileName) { return Path.GetExtension(MapPathFile(fileName)); } /// <summary> /// 获取虚拟目录的物理地址 /// </summary> /// <param name="fileName">文件虚拟路径</param> /// <returns></returns> public static string MapPathFile(string fileName) { return HttpContext.Current.Server.MapPath(fileName); } #endregion #region 下载文件操作 /// <summary> /// 普通下载 /// </summary> /// <param name="fileName">文件虚拟路径</param> public static void DownLoadold(string fileName) { string destFileName = MapPathFile(fileName); if (File.Exists(destFileName)) { FileInfo fi = new FileInfo(destFileName); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ClearHeaders(); HttpContext.Current.Response.Buffer = false; HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Path.GetFileName(destFileName), System.Text.Encoding.UTF8)); HttpContext.Current.Response.AppendHeader("Content-Length", fi.Length.ToString()); HttpContext.Current.Response.ContentType = "application/octet-stream"; HttpContext.Current.Response.WriteFile(destFileName); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); } } /// <summary> /// 分块下载 /// </summary> /// <param name="fileName">文件虚拟路径</param> public static void DownLoad(string fileName) { string filePath = MapPathFile(fileName); long chunkSize = 204800; //指定块大小 byte[] buffer = new byte[chunkSize]; //建立一个200K的缓冲区 long dataToRead = 0; //已读的字节数 FileStream stream = null; try { //打开文件 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); dataToRead = stream.Length; //添加Http头 HttpContext.Current.Response.ContentType = "application/octet-stream"; HttpContext.Current.Response.AddHeader("Content-Disposition", "attachement;filename=" + HttpUtility.UrlEncode(Path.GetFileName(filePath))); HttpContext.Current.Response.AddHeader("Content-Length", dataToRead.ToString()); while (dataToRead > 0) { if (HttpContext.Current.Response.IsClientConnected) { int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize)); HttpContext.Current.Response.OutputStream.Write(buffer, 0, length); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.Clear(); dataToRead -= length; } else { dataToRead = -1; //防止client失去连接 } } } catch (Exception ex) { HttpContext.Current.Response.Write("Error:" + ex.Message); } finally { if (stream != null) stream.Close(); HttpContext.Current.Response.Close(); } } /// <summary> /// 输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小 /// </summary> /// <param name="request">Page.Request对象</param> /// <param name="response">Page.Response对象</param> /// <param name="fileName">下载文件名</param> /// <param name="filePath">带文件名下载路径</param> /// <param name="speed">每秒允许下载的字节数</param> /// <returns>返回是否成功</returns> //--------------------------------------------------------------------- //调用: // string FullPath=Server.MapPath("count.txt"); // ResponseFile(this.Request,this.Response,"count.txt",FullPath,100); //--------------------------------------------------------------------- public static bool ResponseFile(HttpRequest request, HttpResponse response, string fileName, string filePath, long speed) { try { FileStream myFile = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); BinaryReader br = new BinaryReader(myFile); try { response.AddHeader("Accept-Ranges", "bytes"); response.Buffer = false; long fileLength = myFile.Length; long startBytes = 0; int pack = 10240; //10K bytes int sleep = (int)Math.Floor((double)(1000 * pack / speed)) + 1; if (request.Headers["Range"] != null) { response.StatusCode = 206; string[] range = request.Headers["Range"].Split(new char[] { '=', '-' }); startBytes = Convert.ToInt64(range[1]); } response.AddHeader("Content-Length", (fileLength - startBytes).ToString()); if (startBytes != 0) { response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength)); } response.AddHeader("Connection", "Keep-Alive"); response.ContentType = "application/octet-stream"; response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); br.BaseStream.Seek(startBytes, SeekOrigin.Begin); int maxCount = (int)Math.Floor((double)((fileLength - startBytes) / pack)) + 1; for (int i = 0; i < maxCount; i++) { if (response.IsClientConnected) { response.BinaryWrite(br.ReadBytes(pack)); Thread.Sleep(sleep); } else { i = maxCount; } } } catch { return false; } finally { br.Close(); myFile.Close(); } } catch { return false; } return true; } #endregion }
显示效果:
不同的文件上传操但大体都差不多。
以上类库内容来源互联网,站长稍作整理
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。