質問

たぶん簡単な質問ですが、どうしたらいいかわかりません。

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

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

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

エラー:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Specified argument was out of the range of valid values.
Parameter name: i 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: i

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: i]
   System.Text.RegularExpressions.CaptureCollection.GetCapture(Int32 i) +5227599
   System.Text.RegularExpressions.CaptureCollection.get_Item(Int32 i) +4
   CreatePost.btnFinish_Click(Object sender, EventArgs e) +143
   System.EventHandler.Invoke(Object sender, 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(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

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

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;

}
役に立ちましたか?

解決

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

ページの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など)を渡すわけではありません。これらは確認すべき事項です。

他のヒント

  

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

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

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

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

Also:直接<!> quot; jumping into <!> quot;配列の場所は、多くの開発者にとって悪い習慣と見なされています(また、正しい量のアイテムがあると仮定して配列にジャンプするのはあまり良くないと思います)。特に、多次元配列を使用する場合、エラーが発生すると注意が必要になります。配列インデックスで多くの複雑なコードが失敗するのを確認しました。チェックがなかったため、それらをデバッグするのは非常に困難でした(5次元または6次元の配列について話している)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top