Проблемы с загрузкой на рабочий сервер, но не в dev

StackOverflow https://stackoverflow.com/questions/1229854

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

}
Это было полезно?

Решение

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

В вашем методе 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();

Ваш код предполагает, что группы существуют.По какой-то причине (честно говоря, у меня нет регулярных выражений-fu) вы не получаете группы, которые, по вашему мнению, всегда должны существовать на производстве.Я бы убедился, что здесь есть m, есть m.Groups и m.Groups.Count>= 2 и m.Groups [] имеет захваты перед вызовом этих методов.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top