0

我面临一个非常奇怪的问题,不知道该怎么说。但会尽力而为。

我有一个网格视图,其中包含文件上传控件,并且在调用 Update 事件时文件存储在 DB 中。文件上传代码被编写为一个函数,一旦单击更新按钮就会调用该函数。

现在一切都很好,就像当我单击更新时,文件在数据库中更新,但页面进入无限循环,似乎正在处理某些内容。一段时间后,会出现一个对话框,在其中我可以选择下载格式文档中的整个网页已上传(不知道为什么,此对话框如何出现),但页面仍在循环中并正在处理中。我已经检查了我的代码一百次,但仍然找不到问题。

任何解决方案都将受到欢迎。提前致谢。

上传文件代码

rotected void UploadDoc(object sender, EventArgs e)
    {
        int i = 0;

        foreach (GridViewRow row in GVTaskCompDept.Rows)
        {
            if ((row.RowState & DataControlRowState.Edit) > 0)
            {
                FileUpload FU = (FileUpload)GVTaskCompDept.Rows[i].Cells[8].FindControl("FileUpload1");

                string filePath = FU.PostedFile.FileName;
                string filename = Path.GetFileName(filePath);

                if (filePath != null && filePath != "")
                {
                    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                    BinaryReader br = new BinaryReader(fs);
                    Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                    br.Close();
                    fs.Close();

                    string ext = System.IO.Path.GetExtension(FU.FileName).TrimStart(".".ToCharArray()).ToLower();
                    string name = System.IO.Path.GetFileName(FU.FileName);

                    // string ContentType = "";
                    if (ext == "doc" || ext == "docx")
                        ContentType = "application/vnd.ms-word";
                    else if (ext == "xlx" || ext == "xlsx" || ext == "xls")
                        ContentType = "application/vnd.ms-excel";
                    else if (ext == "jpeg" || ext == "jpeg")
                        ContentType = "image/jpeg";
                    else if (ext == "pdf")
                        ContentType = "application/pdf";

                    (Session)["Data"] = bytes;
                    (Session)["Name"] = name;
                    (Session)["Type"] = ContentType;
                }
                else
                {
                    (Session)["Data"] = null;
                    (Session)["Name"] = null;
                    (Session)["Type"] = null;
                }
            }
            i += 1;
        }
    }

RowUpdating 事件就像

 protected void GVTaskCompDept_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {          
            GridViewRow gvrow = GVTaskCompDept.Rows[e.RowIndex];
            Session["rowindex"] = e.RowIndex;
            UploadDoc(null, null);              

     //---Some Code-----//       

            {
                DSTaskCompliance.UpdateParameters["UploadDocTitle"].DefaultValue = (Session)["Name"].ToString();
                DSTaskCompliance.UpdateParameters["UploadDocType"].DefaultValue = (Session["Type"]).ToString();
            }
 //-------Some Code---------//
 DSTaskCompliance.Update();
            DSTaskCompliance.DataBind();            
    }

现在在数据源更新事件中,我将会话变量与其他代码部分一起传递以将其更新到数据库中

protected void DSTaskCompliance_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
        e.Command.Parameters["@UploadDocContent"].Value = Session["Data"];
    } 
4

2 回答 2

0

最后,我终于可以找到解决我的问题的方法了。这只是一个小错误。在上面的代码中,每当上传特定类型的文件时,我都指定了特定的“ContentType”。例如:对于 word 文件,它是 application/vnd.ms-word。

无需指定这一点,因为我发现代码自己找到类型并将其存储在 DB 中。我不需要。由于将其指定为应用程序,它总是倾向于以正在上传的格式下载文件。

非常感谢大家的支持!!!!!!:)

于 2013-01-19T05:53:36.633 回答
0

你这样的代码没有意义。不管怎样,UploadDoc代码最有可能在下面一行抛出异常:

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);

filePath 是客户端路径(在非 IE 浏览器中只能是文件名),尝试在服务器上打开必然会在生产场景中失败。它可能在客户端/服务器都是同一台机器的开发环境中工作。

就您的具体问题而言,我怀疑页面的另一部分 - 您在页面中是否有任何代码试图显示/下载上传的文档?显然,您是否尝试通过在 Visual Studio 等中设置断点来调试该问题

于 2013-01-09T10:46:20.443 回答