现在把源文件上传到文件夹之后,再下载下来,打开的时候就报错,但是如果点击确定,可以修复,只不过到时候保存的时候需要网上说的另存为,上图吧
这是上传:
public static string UploadFileIntoDir(FileUpload MyFile, string DirName) { if (IfOkFile(DirName) == true) { string ReturnStr = string.Empty; if (MyFile.FileContent.Length > 0) { MyFile.SaveAs(System.Web.HttpContext.Current.Request.MapPath("../UploadFile/") + DirName); //将原文件名与现在文件名写入ERPSaveFileName表中 //string NowName = DirName; //修改下载文件换成源文件名称 + 时间节 string NowName = DirName; string OldName = MyFile.FileName; string SqlTempStr = "insert into ERPSaveFileName(NowName,OldName) values ('" + NowName + "','" + OldName + "')"; ZWL.DBUtility.DbHelperSQL.ExecuteSQL(SqlTempStr); return OldName; } else { return ReturnStr; } } else { if (MyFile.FileName.Length > 0) { System.Web.HttpContext.Current.Response.Write("<script>alert('不允许上传此类型文件!');</script>"); return ""; } else { return ""; } } }
这是下载:
1 public void BigFileDownload(string FileName, string FilePath) 2 { 3 System.IO.Stream iStream = null; 4 // Buffer to read 10K bytes in chunk: 5 byte[] buffer = new Byte[10000]; 6 // Length of the file: 7 int length; 8 // Total bytes to read: 9 long dataToRead; 10 // Identify the file to download including its path. 11 string filepath = System.Web.HttpContext.Current.Server.MapPath(FilePath); 12 // Identify the file name. 13 string filename = System.IO.Path.GetFileName(filepath); 14 try 15 { 16 // Open the file. 17 iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, 18 System.IO.FileAccess.Read, System.IO.FileShare.Read); 19 // Total bytes to read: 20 dataToRead = iStream.Length; 21 Response.ContentType = "application/octet-stream"; 22 Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(FileName));//System.Text.UTF8Encoding.UTF8.GetBytes(FileName) 23 // Read the bytes. 24 while (dataToRead > 0) 25 { 26 // Verify that the client is connected. 27 if (Response.IsClientConnected) 28 { 29 // Read the data in buffer. 30 length = iStream.Read(buffer, 0, 10000); 31 // Write the data to the current output stream. 32 Response.OutputStream.Write(buffer, 0, length); 33 // Flush the data to the HTML output. 34 Response.Flush(); 35 buffer = new Byte[10000]; 36 dataToRead = dataToRead - length; 37 } 38 else 39 { 40 //prevent infinite loop if user disconnects 41 dataToRead = -1; 42 } 43 } 44 } 45 catch (Exception ex) 46 { 47 // Trap the error, if any. 48 string message = ex.Message; 49 this.Page.ClientScript.RegisterStartupScript(GetType(), "Message", "<script>alert('Error : " + message + "');</script>"); 50 } 51 finally 52 { 53 if (iStream != null) 54 { 55 //Close the file. 56 iStream.Close(); 57 } 58 } 59 }
现在是doc的可以,但是docx的就需要确定之后,点击是否恢复里面的“是”,不知道是哪里的原因,兼容包也弄了,求解惑
不知道是哪一步报这个错了:http://bbs.csdn.net/topics/370029970
就是流超时,咋解决呀,百度看了半天也没有什么好的办法
难道只有存储成流了吗?有没有什么其他的办法
试试下面的代码:
string filepath = System.Web.HttpContext.Current.Server.MapPath(FilePath); string filename = System.IO.Path.GetFileName(filepath); using(var iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)) { Response.Clear(); Response.ContentEncoding = System.Text.Encoding.UTF8; Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" +
System.Web.HttpUtility.UrlEncode(FileName)); iStream.CopyTo(Response.OutputStream); Response.End(); }
谢谢,搞得有点混了,不知道用个using,已经解决
你可以到服务器上直接打开文档看看,个人感觉是你的下载代码有问题。
但是下载如果 03版之前的就没有任何问题,就是doc的,就没有问题,这里的代码只不过是为了有时候可能要改名字,这里的意思是做出一个另存为这类的意思
http://blog.csdn.net/xianyao_shi/article/details/11556873可能是这个问题,但是我已经释放了,还要怎么优化呢?
@_Vegetables: 没见你Response.End()呢?
@幻天芒: 好的,我试试,希望能解决吧,虽然说这不是个大问题,但是客户体验很不爽的,唉
@_Vegetables: 我觉得你这个下载,完全没必要用while来处理流哇。直接整个扔给Response就可以了吧。
@幻天芒: 我把while去掉之后,下载docx的文档还是不行,但是xlsx的就可以,就是word不行,真心是醉了,不知道是哪里的问题
@_Vegetables: 理论上还是代码问题。首先,你要确认到服务器上的文件是好的。那么就基本上是下载文件代码的问题。另外,还可以用其他的下载方式,比如将文件复制到下载目录,然后直接给绝对地址。
@_Vegetables: 给你贴段代码,哎:
try { string FileName = ".//路径//书名.pdf"; FileName = ".//路径//文件名.扩展名"; FullFileName = Server.MapPath(FileName); //FileName--要下载的文件名 FileInfo DownloadFile = new FileInfo(FullFileName); if (DownloadFile.Exists) { Response.Clear(); Response.ClearHeaders(); Response.Buffer = false; Response.ContentType = "application/octet-stream"; Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.ASCII)); Response.AppendHeader("Content-Length", DownloadFile.Length.ToString()); Response.WriteFile(DownloadFile.FullName); Response.Flush(); Response.End(); } else { //文件不存在 } } catch { //打开时异常了 }
@幻天芒: 这里的fileInfo是什么东西呢?
@_Vegetables: 就是System.IO.FileInfo这个类哇。
@幻天芒: 好吧,确实有点昏了,被这个鸡巴问题搞的纠结死了,问题已经OK,已经知道是哪里的问题,内存释放的不完整,所以说流也超时了
@_Vegetables: 之前都说去掉while和end的嘛。
@幻天芒: 谢谢
@_Vegetables: 客气了,解决问题了就好!