Frage

Vielleicht eine einfache Frage, aber ich weiß wirklich nicht, was zu tun ist.

Wenn ich eine Datei über ein Formular mit <asp:FileUpload> einreichen, es funktioniert perfekt auf meiner Dev-Maschine.

Wenn ich die gleiche Sache auf dem Server versuchen, es gibt mir die folgenden Fehler. Der Fehler wird mir nicht helfen, weil ich diese Funktion habe nicht einmal in meinem Code  (Capture) und ich habe nicht eine Variable namens „i“. So jetzt, weiß ich wirklich nicht.

Ist das eine Frage von rechts auf dem Server (ich glaube nicht, weil ich all Rechte möglich geben, und der Fehler ist immer noch da), ist es etwas auf meinem Code (aber es auf meiner dev Maschine arbeiten .. .). Ich kann mehr Code zeigen, wenn Sie brauchen!

Der Fehler:

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

Hier ist der Code, der das Hochladen der Fall ist. Und vielleicht sind Sie mit dem regex rechts. Aber warum ist es auf dev arbeitet und nicht auf 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;

}
War es hilfreich?

Lösung

Sie müssen Ihren Code schreiben, aber für einen Schuss im Dunkeln ...

In Ihrer btnFinish_Click Methode auf Ihrer Seite, es ist etwas falsch mit, wo Sie versuchen, einen regulären Ausdruck zu verwenden.

Wahrscheinlich haben Sie aufgenommen haben eine Gruppe von RegEx Spiele und versuchte durch sie aufzuzählen, wenn es wirklich nicht. (Oder Sie haben eine For-Schleife durch weitere Elemente gehen als die Sammlung / Liste tatsächlich hat.)

Edit: Ich bin 99% sicher, dass es direkt nach dem hier:

Match m = r.Match(filepath);

Bevor Sie etwas anderes tun, nach dieser Zeile, um zu sehen, ob es irgendwelche Gruppen.

if (m.Groups.Count == 0) { DoSomethingElseHere(); }

Dann sehen, ob es irgendwelche Aufnahmen in dieser Gruppe sind:

if (m.Groups[0].Captures.Count == 0) { DoSomethingElseHere(); }

Schließlich finden Sie heraus, was, indem Sie diese mit der Eingabe falsch läuft, aber im Code suchen und nicht aktiv das Debuggen, ist dies die einzige gute Möglichkeit, um herauszufinden.

Edit 2: By the way, der Grund, im Prinzip, dass dieses Problem bei Ihnen haben, weil Sie nicht wirklich die Eingabe bestätigt haben, bevor Sie versuchen, es zu benutzen. Der Code, den ich habe nur als Probe erhalten Sie begonnen, aber man sollte immer sanieren, was Ihnen kommt.

Auch wenn Sie eine Upload-Steuerung verwenden, nicht alle Browser in einem vollständigen UNC-Pfad zur Datei (dh \ server \ share \ file.ext) übergeben wird - einige werden im Dateinamen übergeben Sie einfach von selbst, so diese sind einige Dinge zu überprüfen.

Andere Tipps

  

string file_ext = m.Groups[2].Captures[0].ToString(); string filename = m.Groups[1].Captures[0].ToString();

Der Code setzt die Gruppen existieren. Aus irgendeinem Grund (ehrlich habe ich keine Regex-fu) Sie sind nicht immer die Gruppen, die Sie immer auf die Produktion existieren denken sollte. Ich würde dafür sorgen, hier ist ein m, dort m.Groups und m.Groups.Count> = 2 und m.Groups ist [] erfasst hat, bevor diese Methoden aufrufen.

Vielleicht legt die Produktionsumgebung, die Dateien in einem anderen Ort. Versuchen Sie, zu überprüfen, was den Ordner der Produktionsserver legt seine Dateien und wo die Entwicklung der Fall ist. Diese Probleme häufig passieren, wenn die Entwicklung und Live ist mit verschiedenen Betriebssystemen oder verschiedene IIS-Versionen. Möglicherweise ist der Unterschied in dem Lagerort bewirkt, dass Ihr reg-ex zum Scheitern verurteilt. Ich bin kein regex Pro so weiß ich nicht, ob Ihre regex einen Fehler enthalten könnten, aber dies ist das erste, was ich denken konnte.

Auch ist DEV Ihre eigene Maschine? In diesem Fall: verwenden Sie IIS oder verwenden Sie die ASP.NET-Entwicklungsserver? Da IIS und der ASP.NET-Entwicklungsserver in Visual Studio integrierte verhalten sich unterschiedlich in bestimmten Situationen.

Auch: direkt „Sprung in“ eine Array Lage wird von vielen Entwicklern schlecht-Praxis betrachtet (ich denke auch, es ist nicht sehr gut ist, einfach in das Feld zu springen die richtige Menge von Gegenständen unter der Annahme gebe es). Vor allem, wenn Multi Dimension Arrays kann es schwierig werden, wenn Fehler auftreten. Ich habe viele komplexen Code Fehler auf Array-Indizes gesehen und weil es keine Kontrollen war, war es sehr schwierig, sie zu debuggen (ich spreche von 5 oder 6 Dimension Arrays).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top