【问题标题】:Issues with upload on production server but not in dev在生产服务器上上传但在开发中没有的问题
【发布时间】:2009-08-04 20:48:23
【问题描述】:

也许是一个简单的问题,但我真的不知道该怎么办。

当我使用<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;

}

【问题讨论】:

  • 您可以在您的 btnFinish_Click() 方法中发布代码吗?
  • 预测:我们正在寻找您的生产机器上尚不存在的文件或文件夹的名称。

标签: asp.net file-upload production


【解决方案1】:

您需要发布您的代码,但为了在黑暗中拍摄...

在您页面上的 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) - 有些浏览器只会自行传递文件名,所以这些是需要检查的。

【讨论】:

  • 好吧,我昨天检查了一下,这可能是有道理的,但我必须做一些测试,而且在 prod 上进行测试并不容易。一旦我的错误是正确的,我会回来并将您的答案标记为答案。非常感谢
【解决方案2】:

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[] 在调用这些方法之前有捕获。

【讨论】:

  • 您的回答建议与 routeNpingme 相同的事情,所以我想这是我需要检查的事情。在接下来的几天里会做。谢谢!
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多