0

私は非常に奇妙な問題に直面しており、それを置く方法がわかりません。しかし、自分のレベルでベストを尽くします。

ファイルアップロードコントロールで構成されるグリッドビューがあり、Update イベントが呼び出されるとファイルが DB に保存されます。ファイルのアップロード コードは、更新ボタンがクリックされるとすぐに呼び出される関数として記述されています。

更新をクリックすると、DB でファイルが更新されますが、ページが無限ループに入り、何かが処理されているように見えます。しばらくすると、アップロードされたドキュメントの形式で Web ページ全体をダウンロードするオプションが表示されるダイアログ ボックスが表示されます (理由がわからない、このダイアログ ボックスがどのように表示されるか)。コードを何百回もチェックしましたが、まだ問題を見つけることができません。

どんな解決策も歓迎されます。前もって感謝します。

アップロード ドキュメントのコード

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();            
    }

DataSource Updating Event で、セッション変数をコードの他の部分と一緒に渡して、DB に更新します

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 ブラウザーではファイル名のみ) であり、サーバー上で開こうとすると、運用シナリオでは失敗することになります。おそらく、クライアント/サーバーが両方とも同じマシンである開発環境で動作しています。

あなたの特定の問題に関する限り、私の疑いはページの他の部分にあります-アップロードされたドキュメントを表示/ダウンロードしようとするコードがページ内にありますか? 明らかに、ビジュアルスタジオなどでブレークポイントを設定して、問題を回避しようとしましたか?

于 2013-01-09T10:46:20.443 に答える