Проблемы с загрузкой на рабочий сервер, но не в dev - PullRequest
3 голосов
/ 05 августа 2009

Может быть, простой вопрос, но я действительно не знаю, что делать.

Когда я отправляю файл через форму, используя <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 ]

3 голосов
/ 05 августа 2009

Вам нужно будет опубликовать свой код, но для выстрела в темноте ...

В вашем методе 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 голос
/ 05 августа 2009

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 [] захватывает данные перед вызовом этих методов.

0 голосов
/ 05 августа 2009

Возможно, производственная среда размещает файлы в другом месте. Попробуйте проверить, в какую папку производственный сервер помещает свои файлы и где делает разработка. Эти проблемы часто возникают, когда в процессе разработки и в реальном времени используются разные операционные системы или разные версии IIS. Возможно, из-за разницы в расположении хранилища ваш reg-ex выйдет из строя. Я не являюсь опытным профессионалом, поэтому я не знаю, может ли ваше регулярное выражение содержать ошибку, но это первое, о чем я мог подумать.

Кроме того, DEV - это ваша собственная машина? В этом случае: вы используете IIS или сервер разработки ASP.NET? Поскольку IIS и сервер разработки ASP.NET, интегрированные в Visual Studio, в некоторых ситуациях ведут себя по-разному.

Кроме того: прямой переход в местоположение массива считается плохой практикой для многих разработчиков (я также думаю, что не очень хорошо просто прыгать в массив при условии правильного количества элементов). Особенно при использовании многомерных массивов может возникнуть сложность при возникновении ошибок. Я видел много сложных кодов, которые не работают на индексах массива, и поскольку проверок не было, их было довольно сложно отладить (я говорю о 5 или 6 массивах измерений).

...