3

単純な質問かもしれませんが、私は本当に何をすべきかわかりません。

を使用してフォームからファイルを送信すると、<asp:FileUpload>開発マシンで完全に機能します。

サーバーで同じことをしようとすると、以下のエラーが表示されます。コード (CaptureCollection) にこの関数さえなく、「i」という変数がないため、エラーはまったく役に立ちません。だから今、私は本当に知りません。

これはサーバー上での権利の問題ですか(可能な限りすべての権利を与えてもエラーがまだ残っているため、そうは思いません)、それは私のコード上のものですか(しかし、私の開発マシンでは動作します...)。必要に応じて、さらに多くのコードを表示できます。

エラー:

「/」アプリケーションでサーバー エラーが発生しました。
-------------------------------------------------- ------------------------------

指定された引数は有効な値の範囲外です。
パラメータ名: i
説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.ArgumentOutOfRangeException: 指定された引数が有効な値の範囲外でした。
パラメータ名: i

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。  

スタックトレース:


[ArgumentOutOfRangeException: 指定された引数が有効な値の範囲外でした。
パラメータ名:i]
   System.Text.RegularExpressions.CaptureCollection.GetCapture(Int32 i) +5227599
   System.Text.RegularExpressions.CaptureCollection.get_Item(Int32 i) +4
   CreatePost.btnFinish_Click(オブジェクト送信者, EventArgs e) +143
   System.EventHandler.Invoke(オブジェクト送信者, EventArgs e) +0
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain (ブール値 includeStagesBeforeAsyncPoint、ブール値 includeStagesAfterAsyncPoint) +1565

アップロードを行うコードは次のとおりです。そして多分あなたは正規表現に正しいです。しかし、なぜ本番環境ではなく開発環境で動作するのでしょうか?

protected void btnFinish_Click(object sender, EventArgs e)
{
    string file = "";
    string csFinalPath = "";

    if (uploadPhoto.HasFile)
    {
        string filepath = uploadPhoto.PostedFile.FileName;
        string pat = @"\\(?:.+)\\(.+)\.(.+)";
        Regex r = new Regex(pat);

        //run
        Match m = r.Match(filepath);
        string file_ext = m.Groups[2].Captures[0].ToString();
        string filename = m.Groups[1].Captures[0].ToString();
        file = filename + "." + file_ext;

        //save the file to the server 
        uploadPhoto.PostedFile.SaveAs(Server.MapPath(".\\upload\\") + file);

        ThumbnailGenerator thumbGenerator = new ThumbnailGenerator();

        if (thumbGenerator.GetThumbnail(Server.MapPath(".\\upload\\") + file,
        Server.MapPath(".\\upload\\thumb\\") + "Thumb" + file))
        {
            csFinalPath = "./upload/thumb/" + "Thumb" + file;
        }
        else
        {
            //TODO: Do an error message!!!
        }
    }
    else
    {
        csFinalPath = "./images/no_image.gif";
    }

    m_database.InsertPost(Convert.ToInt32(Session["ID"].ToString()),
        Convert.ToInt32(ddlCategory.SelectedValue),
        m_nType,
        txtLink.Text,
        txtTitreFR.Text,
        txtTitreEN.Text,
        txtDescriptionFR.Text,
        txtDescriptionEN.Text,
        csFinalPath,
        "",
        "");

    panelLink.Visible = false;
    panelResult.Visible = true;

}
4

3 に答える 3

3

コードを投稿する必要がありますが、暗い場所でのショットの場合...

ページの btnFinish_Click メソッドで、正規表現を使用しようとしている場所に問題があります。

ほとんどの場合、RegEx 一致のグループをキャプチャし、それらを列挙しようとしましたが、実際には何もありません。(または、コレクション/リストが実際に持っているよりも多くの項目を通過する For ループがあります。)

編集:ここの直後にあると99%確信しています:

Match m = r.Match(filepath);

他のことを行う前に、この行の後に、グループがあるかどうかを確認してください。

if (m.Groups.Count == 0) { DoSomethingElseHere(); }

次に、そのグループにキャプチャがあるかどうかを確認します。

if (m.Groups[0].Captures.Count == 0) { DoSomethingElseHere(); }

最終的には、これを行うことで入力の何が問題なのかを見つけることができますが、コードを見て、これを積極的にデバッグするのではなく、これが唯一の良い方法です。

編集 2:ところで、この問題が発生している原則的な理由は、使用する前に入力を実際に検証していないためです。先ほどサンプルとして示したコードで作業を開始できますが、これから発生するものは常にサニタイズする必要があります。

また、アップロード コントロールを使用している場合、すべてのブラウザーがファイルへの完全な UNC パス (つまり、\server\share\file.ext) を渡すわけではありません。一部のブラウザーは、ファイル名だけを渡すだけなので、これらはいくつかの確認事項。

于 2009-08-04T20:57:40.857 に答える
1

string file_ext = m.Groups[2].Captures[0].ToString(); string filename = m.Groups[1].Captures[0].ToString();

あなたのコードは、グループが存在することを前提としています。なんらかの理由で (正直なところ、正規表現はありません)、本番環境に常に存在するはずのグループを取得できません。ここに m があり、m.Groups と m.Groups.Count >= 2 があり、m.Groups[] にはこれらのメソッドを呼び出す前にキャプチャがあることを確認します。

于 2009-08-04T23:39:37.567 に答える
0

本番環境では、ファイルが別の場所に配置されている可能性があります。運用サーバーがファイルを配置するフォルダーと、開発が行われる場所を確認してください。これらの問題は、開発とライブで異なるオペレーティング システムまたは異なる IIS バージョンを使用している場合に頻繁に発生します。おそらく、保存場所の違いにより、正規表現が失敗する可能性があります。私は正規表現のプロではないので、あなたの正規表現にエラーが含まれているかどうかはわかりませんが、これは私が考えることができる最初のことです.

また、DEV はご自身のマシンですか?その場合: IIS を使用していますか、それとも ASP.NET 開発サーバーを使用していますか? IIS と Visual Studio に統合された ASP.NET 開発サーバーは、特定の状況で異なる動作をするためです。

また、配列の場所に直接「ジャンプ」することは、多くの開発者によって悪い習慣と見なされています (また、正しい量の項目があると仮定して配列にジャンプするのはあまり良くないと思います)。特に多次元配列を使用する場合、エラーが発生すると扱いにくくなる可能性があります。多くの複雑なコードが配列インデックスで失敗するのを見てきましたが、チェックがなかったため、それらをデバッグするのは非常に困難でした (5 次元または 6 次元の配列について話している)。

于 2009-08-05T07:09:28.973 に答える