在生产服务器上但不在dev中上载的问题

时间:2009-08-04 20:48:23

标签: asp.net file-upload production

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

当我使用<asp:FileUpload>通过表单提交文件时,它在我的开发机器上完美运行。

当我在服务器上尝试相同的操作时,它会在下面给出错误。该错误对我没有帮助,因为我的代码中甚至没有这个功能  (CaptureCollection)我没有名为“i”的变量。所以现在,我真的不知道。

这是服务器上的权利问题(我不这么认为,因为我提供了所有可能的权利,错误仍然存​​在),这是我的代码上的东西(但它在我的开发机器上工作.. )。如果需要,我可以显示更多代码!

错误:

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

以下是执行上传的代码。也许你对正则表达式是正确的。但是为什么它在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;

}

3 个答案:

答案 0 :(得分: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) - 有些只会自行传入文件名,所以这些是需要检查的东西。

答案 1 :(得分:1)

  

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

答案 2 :(得分:0)

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

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

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