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(Object sender, EventArgs e) +143
   System.EventHandler.Invoke(对象发送者,EventArgs e)+0
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串 eventArgument)+110
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 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

这是执行上传的代码。也许你对正则表达式是正确的。但是为什么它在 dev 而不是 prod 上工作?

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

您的代码假定组存在。出于某种原因(老实说,我没有 regex-fu)你没有得到你认为应该始终存在于生产中的组。我会确保这里是一个 m,有 m.Groups 和 m.Groups.Count >= 2 并且 m.Groups[] 在调用这些方法之前有捕获。

于 2009-08-04T23:39:37.567 回答
0

也许生产环境将文件放在不同的位置。尝试检查生产服务器放置他的文件的文件夹以及开发所在的位置。当开发和直播使用不同的操作系统或不同的 IIS 版本时,这些问题经常发生。存储位置的差异可能会导致您的 reg-ex 失败。我不是正则表达式专家,所以我不知道您的正则表达式是否可能包含错误,但这是我能想到的第一件事。

另外,DEV 是你自己的机器吗?在这种情况下:您是使用 IIS 还是使用 ASP.NET 开发服务器?因为 IIS 和集成在 Visual Studio 中的 ASP.NET 开发服务器在某些情况下的行为不同。

另外:直接“跳入”数组位置被许多开发人员认为是不好的做法(我也认为假设存在正确数量的项目,直接跳入数组并不是很好)。尤其是在使用多维数组时,发生错误时会变得很棘手。我已经看到许多复杂的代码在数组索引上失败,并且因为没有检查很难调试它们(我说的是 5 或 6 维数组)。

于 2009-08-05T07:09:28.973 回答