首页 新闻 会员 周边

.net 文档下载问题

0
悬赏园豆:30 [已解决问题] 解决于 2015-03-11 16:13

现在把源文件上传到文件夹之后,再下载下来,打开的时候就报错,但是如果点击确定,可以修复,只不过到时候保存的时候需要网上说的另存为,上图吧

这是上传:

  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 "";
                }
            }
        }
View Code

这是下载:

 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     }
View Code

现在是doc的可以,但是docx的就需要确定之后,点击是否恢复里面的“是”,不知道是哪里的原因,兼容包也弄了,求解惑

不知道是哪一步报这个错了:http://bbs.csdn.net/topics/370029970

就是流超时,咋解决呀,百度看了半天也没有什么好的办法

问题补充:

难道只有存储成流了吗?有没有什么其他的办法

_Vegetables的主页 _Vegetables | 小虾三级 | 园豆:586
提问于:2015-03-10 13:39
< >
分享
最佳答案
0

试试下面的代码:

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(); }
收获园豆:15
dudu | 高人七级 |园豆:31003 | 2015-03-11 15:15

谢谢,搞得有点混了,不知道用个using,已经解决

_Vegetables | 园豆:586 (小虾三级) | 2015-03-11 16:13
其他回答(1)
0

你可以到服务器上直接打开文档看看,个人感觉是你的下载代码有问题。

收获园豆:15
幻天芒 | 园豆:37175 (高人七级) | 2015-03-10 13:45

但是下载如果 03版之前的就没有任何问题,就是doc的,就没有问题,这里的代码只不过是为了有时候可能要改名字,这里的意思是做出一个另存为这类的意思

支持(0) 反对(0) _Vegetables | 园豆:586 (小虾三级) | 2015-03-10 13:53

http://blog.csdn.net/xianyao_shi/article/details/11556873可能是这个问题,但是我已经释放了,还要怎么优化呢?

支持(0) 反对(0) _Vegetables | 园豆:586 (小虾三级) | 2015-03-10 14:36

@_Vegetables: 没见你Response.End()呢?

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-03-10 16:57

@幻天芒: 好的,我试试,希望能解决吧,虽然说这不是个大问题,但是客户体验很不爽的,唉

支持(0) 反对(0) _Vegetables | 园豆:586 (小虾三级) | 2015-03-10 17:12

@_Vegetables: 我觉得你这个下载,完全没必要用while来处理流哇。直接整个扔给Response就可以了吧。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-03-10 17:21

@幻天芒: 我把while去掉之后,下载docx的文档还是不行,但是xlsx的就可以,就是word不行,真心是醉了,不知道是哪里的问题

支持(0) 反对(0) _Vegetables | 园豆:586 (小虾三级) | 2015-03-11 09:05

@_Vegetables: 理论上还是代码问题。首先,你要确认到服务器上的文件是好的。那么就基本上是下载文件代码的问题。另外,还可以用其他的下载方式,比如将文件复制到下载目录,然后直接给绝对地址。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-03-11 09:27

@_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
        {
           //打开时异常了
        } 
支持(1) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-03-11 14:36

@幻天芒: 这里的fileInfo是什么东西呢?

支持(0) 反对(0) _Vegetables | 园豆:586 (小虾三级) | 2015-03-11 15:47

@_Vegetables: 就是System.IO.FileInfo这个类哇。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-03-11 16:08

@幻天芒: 好吧,确实有点昏了,被这个鸡巴问题搞的纠结死了,问题已经OK,已经知道是哪里的问题,内存释放的不完整,所以说流也超时了

支持(0) 反对(0) _Vegetables | 园豆:586 (小虾三级) | 2015-03-11 16:12

@_Vegetables: 之前都说去掉while和end的嘛。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-03-11 16:35

@幻天芒: 谢谢

支持(0) 反对(0) _Vegetables | 园豆:586 (小虾三级) | 2015-03-11 16:36

@_Vegetables: 客气了,解决问题了就好!

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-03-11 16:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册