.net文件上传、下载
/// <summary> /// 上传文件 /// </summary> /// <returns></returns> [HttpPost] public ActionResult Upload() { //调用页面的上传控件,实现文件的上传 var file = Request.Files[0]; var id = Request["id"] ?? ""; //如果是重新上传的话,会有id var type = Request["type"] ?? ""; //主文件没有type,照片卷的照片标签、图纸卷的图纸备考表、拓片及摹本的登记表、电子文件卷的光盘标签,这几类辅助文件会有type if ((file != null) && (file.ContentLength > 0)) { string uploadfilename = file.FileName; //用户上传的原始文件名,数据库中也要存储,用于用户下载的时候重命名 string extention = uploadfilename.Substring(uploadfilename.LastIndexOf(".")).ToLower(); string saveFileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + extention; string path = Server.MapPath("~/Upload/SYZL/Doc/");//取得上传的目标文件夹 string filePath = path + saveFileName; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } file.SaveAs(Path.Combine(path, saveFileName)); //上传文件 if ((extention == ".pdf") || (extention == ".doc") || (extention == ".docx") || (extention == ".xls") || (extention == ".xlsx") || (extention == ".ppt") || (extention == ".pptx")) { //在完成pdf,office格式文档上传之后,进行文档格式的转换,以便使用flexpaper在线预览 ConvertFileFormat(saveFileName); /* var workingThread = new Thread(ConvertFileFormat); workingThread.Start(saveFileName); */ } //更新数据库记录,新增数据库记录的操作不在这里做,在提交表单的时候做,原始文件名和保存文件名已经返回给表单 if (id != "") //id不为空,是重新上传文件动作,需要更新主键为id的数据库记录 { var syxxxq = db.T_SYXXXQ.Find(Int32.Parse(id)); if (syxxxq != null) { //判断type是否为空,如果type为空,则为主文件,否则,则为辅文件 if (type != "") { var ajdhqlw = syxxxq.SYXXZLLXBH.Trim(); //案卷档号前两位 //如果老文件存在,则删除老文件 DeleteOldFile(syxxxq.LJWJMC); //更新图纸卷的"图纸备考表原始上传文件名":TZBKBYSM,"图纸备考表保存文件名":TZBKBBCM syxxxq.NRBT = uploadfilename; //原始文件名 syxxxq.LJWJMC = saveFileName; //保存文件名 db.Entry(syxxxq).State = EntityState.Modified; db.SaveChanges(); } else { //如果老文件存在,则删除老文件 DeleteOldFile(syxxxq.NRBT); //上传的是主文件,更新主文件数据库记录 syxxxq.NRBT = uploadfilename; //原始文件名 syxxxq.LJWJMC = saveFileName; //保存文件名 syxxxq.WJLX = GetFileTypeByExtention(extention); syxxxq.ADDSJ = DateTime.Now; db.Entry(syxxxq).State = EntityState.Modified; db.SaveChanges(); } } } //返回保存文件名,原始文件名 return Content("{\"NRBT\":\"" + uploadfilename + "\",\"LJWJMC\":\"" + saveFileName + "\",\"WJLJ\":\"" + filePath + "\",\"WJLX\":\"" + GetFileTypeByExtention(extention) + "\"}"); } return Content("0"); }
1 public string downloadFile() 2 { 3 string id = Request["id"] ?? ""; 4 if (!string.IsNullOrEmpty(id)) 5 { 6 var syxxxq = db.T_SYXXXQ.Find(Int32.Parse(id)); 7 string path = Server.MapPath("~/Upload/SYZL/Doc/");//取得上传的目标文件夹 8 string fileName = syxxxq.LJWJMC;//保存的路径文件名 9 string khdFileName = syxxxq.NRBT;//客户端文件名 10 string filePath = path + fileName;//服务器上保存的路径 11 var fileInfo = new FileInfo(filePath); 12 if (fileInfo.Exists == true) 13 { 14 #region 未测试的另一种下载方法 15 //FileInfo fi = new FileInfo(fileName); 16 //Response.Clear(); 17 //Response.ClearHeaders(); 18 //Response.Buffer = true; 19 //Response.Charset = "GB2312"; 20 21 ////添加头信息,为 "文件下载/另存为 "对话框指定默认文件名 22 //Response.AppendHeader("Content-Disposition", "attachment;filename=" 23 // + HttpUtility.UrlEncode(Path.GetFileName(filePath), 24 // System.Text.Encoding.UTF8)); 25 //Response.AppendHeader("Content-Length", fi.Length.ToString()); 26 //Response.ContentType = "application/octet-stream"; 27 //Response.Filter.Close(); 28 //Response.WriteFile(filePath); 29 //Response.Flush(); 30 //Response.End(); 31 #endregion 32 const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力 33 byte[] buffer = new byte[ChunkSize]; 34 35 Response.Clear(); 36 var iStream = System.IO.File.OpenRead(filePath); 37 long dataLengthToRead = iStream.Length;//获取下载的文件总大小 38 Response.ContentType = "application/octet-stream"; 39 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName)); 40 while (dataLengthToRead > 0 && Response.IsClientConnected) 41 { 42 int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小 43 Response.OutputStream.Write(buffer, 0, lengthRead); 44 Response.Flush(); 45 dataLengthToRead = dataLengthToRead - lengthRead; 46 } 47 Response.Close(); 48 } 49 } 50 return "下载的文件不存在!"; 51 }
思路、参考。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。