2009-08-04 8 views
3

Vielleicht eine einfache Frage, aber ich weiß wirklich nicht, was zu tun ist.Probleme mit dem Upload auf Produktionsserver aber nicht in Entwickler

Wenn ich eine Datei über ein Formular unter Verwendung <asp:FileUpload> einreiche, funktioniert es perfekt auf meinem Dev-Computer.

Wenn ich das gleiche auf dem Server versuchen, gibt es mir den Fehler unten. Der Fehler hilft mir überhaupt nicht, weil ich diese Funktion nicht einmal in meinem Code (CaptureCollection) habe und ich habe keine Variable namens "i". So, jetzt weiß ich es wirklich nicht.

Ist das eine Frage von Recht auf dem Server (ich glaube nicht, weil ich alle Rechte gebe und der Fehler immer noch da ist), ist es etwas auf meinem Code (aber es funktioniert auf meinem Dev-Rechner. ..). 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 hast du Recht mit der Regex. Aber warum arbeitet es am Entwickler und nicht am Produkt?

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; 

} 
+1

Können Sie den Code in Ihre btnFinish_Click() -Methode schreiben? –

+0

Vorhersage: Wir suchen nach dem Namen einer Datei oder eines Ordners, die noch nicht auf Ihrem Produktionsrechner vorhanden sind. – Dustman

Antwort

3

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

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

Höchstwahrscheinlich haben Sie eine Gruppe von RegEx-Übereinstimmungen erfasst und versucht, durch sie aufzuzählen, wenn es wirklich keine gibt. (Oder Sie haben eine For-Schleife durch weitere Elemente gehen als die Sammlung/Liste tatsächlich.)

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

Match m = r.Match(filepath); 

Bevor Sie etwas tun Andernfalls prüfen Sie nach dieser Zeile, ob Gruppen vorhanden sind.

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

Dann sehen, ob es irgendwelche Aufnahmen in dieser Gruppe:

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

Letztlich finden Sie heraus, was mit der Eingabe falsch läuft durch das tun, aber im Code suchen und nicht aktiv debuggen Dies ist der einzige gute Weg, das herauszufinden.

Bearbeiten 2: Übrigens ist der Grund im Grunde, dass Sie dieses Problem haben, weil Sie die Eingabe nicht wirklich überprüft haben, bevor Sie versuchen, es zu verwenden. Der Code, den ich Ihnen als Beispiel gegeben habe, wird Ihnen den Anfang machen, aber Sie sollten immer das, was Ihnen kommt, bereinigen.

Wenn Sie ein Upload-Steuerelement verwenden, übergeben nicht alle Browser einen vollständigen UNC-Pfad an die Datei (z. B. \ server \ share \ file.ext) - einige geben nur den Dateinamen selbst weiter Das sind einige Dinge, nach denen Sie suchen sollten.

+0

Ok, ich habe das gestern überprüft und das macht wahrscheinlich Sinn, aber ich muss ein paar Tests machen und es ist nicht so einfach, Tests auf Prod zu machen. Sobald mein Fehler korrekt ist, werde ich zurückkommen und Ihre Antwort als Antwort markieren. Vielen Dank –

1

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

Ihr Code setzt voraus, dass die Gruppen existieren. Aus irgendeinem Grund (ehrlich gesagt, ich habe keine Regex-Fu) erhältst du nicht die Gruppen, von denen du glaubst, dass sie immer in der Produktion existieren sollten. Ich würde sicherstellen, dass hier ein m ist, es gibt m.Groups und m.Groups.Count> = 2 und m.Groups [] hat Captures, bevor diese Methoden aufgerufen werden.

+0

Ihre Antwort schlägt das gleiche vor wie routeNpingme, also denke ich, das ist die Sache, die ich überprüfen muss. Werde es in den nächsten Tagen tun. Vielen Dank! –

0

Möglicherweise platziert die Produktionsumgebung die Dateien an einem anderen Speicherort. Versuchen Sie zu überprüfen, in welchem ​​Ordner der Produktionsserver seine Dateien ablegt und wo die Entwicklung abläuft. Diese Probleme treten häufig auf, wenn die Entwicklung und das Live-Betriebssystem unterschiedliche Betriebssysteme oder unterschiedliche IIS-Versionen verwenden. Möglicherweise führt der Unterschied im Speicherort dazu, dass Ihre Registrierung fehlschlägt. Ich bin kein Reg-Ex-Profi, also weiß ich nicht, ob Ihre Regex einen Fehler enthalten könnte, aber das ist das erste, was mir einfällt.

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

Auch: direkt in einen Array-Ort "springen" gilt als schlechte Praxis von vielen Entwicklern (ich denke auch, dass es nicht sehr gut ist, einfach in das Array zu springen unter der Annahme, dass die richtige Menge von Elementen da sind). Insbesondere bei der Verwendung von Multi-Dimension-Arrays kann es beim Auftreten von Fehlern schwierig werden. Ich habe viele komplexe Code-Fehler auf Array-Indizes gesehen und weil es keine Checks gab, war es ziemlich schwierig, sie zu debuggen (ich spreche von 5 oder 6 dimensionalen Arrays).

Verwandte Themen