Domanda

Forse una domanda semplice ma davvero non so cosa fare.

Quando invio un file tramite un modulo utilizzando <asp:FileUpload>, funziona perfettamente sulla mia macchina di sviluppo.

Quando provo la stessa cosa sul server, mi dà l'errore di seguito. L'errore non mi aiuta affatto perché non ho nemmeno questa funzione nel mio codice  (CaptureCollection) e non ho una variabile chiamata & Quot; i & Quot ;. Quindi in questo momento, davvero non lo so.

È una questione di diritto sul server (non credo perché do tutti i diritti possibili e l'errore è ancora lì), è qualcosa sul mio codice (ma funziona sulla mia macchina di sviluppo .. .). Posso mostrare più codice se necessario!

L'errore:

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

Ecco il codice che esegue il caricamento. E forse hai ragione con la regex. Ma perché funziona su dev e non su 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;

}
È stato utile?

Soluzione

Dovrai pubblicare il tuo codice, ma per uno scatto al buio ...

Nel tuo metodo btnFinish_Click sulla tua pagina, c'è qualcosa di sbagliato nel punto in cui stai cercando di usare un'espressione regolare.

Molto probabilmente hai catturato un gruppo di partite RegEx e hai provato a enumerarle, quando in realtà non ce ne sono. (Oppure hai un ciclo For che attraversa più elementi di quanti ne abbiano effettivamente la raccolta / lista.)

Modifica: sono sicuro al 99% che è subito dopo qui:

Match m = r.Match(filepath);

Prima di fare qualsiasi altra cosa, dopo questa riga, controlla se ci sono gruppi.

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

Quindi, controlla se ci sono acquisizioni in quel gruppo:

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

Alla fine scoprirai cosa non va nell'input facendo questo, ma guardando il codice e non eseguendo il debug attivo, questo è l'unico buon modo per scoprirlo.

Modifica 2: A proposito, il motivo in linea di principio che stai riscontrando questo problema è perché non hai realmente convalidato l'input prima di provare a usarlo. Il codice che ho appena dato come esempio ti farà iniziare, ma dovresti sempre disinfettare ciò che ti sta arrivando.

Inoltre, se stai utilizzando un controllo di caricamento, non tutti i browser passeranno in un percorso UNC completo al file (cioè \ server \ share \ file.ext) - alcuni passeranno semplicemente il nome del file da solo, quindi queste sono alcune cose da verificare.

Altri suggerimenti

  

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

Il tuo codice presume l'esistenza dei gruppi. Per qualche ragione (onestamente non ho regex-fu) non stai ottenendo i gruppi che pensi debbano sempre esistere in produzione. Mi assicurerei che qui sia un m, ci sono m.Groups e m.Groups.Count & Gt; = 2 e m.Groups [] ha acquisizioni prima di chiamare quei metodi.

Forse l'ambiente di produzione colloca i file in una posizione diversa. Prova a controllare in quale cartella il server di produzione posiziona i suoi file e dove fa lo sviluppo. Questi problemi si verificano spesso quando lo sviluppo e live utilizzano sistemi operativi diversi o versioni IIS diverse. Probabilmente la differenza nella posizione di archiviazione causa il fallimento di reg-ex. Non sono un reg-ex pro, quindi non so se la tua regex potrebbe contenere un errore, ma questa è la prima cosa che mi viene in mente.

Inoltre, DEV è la tua macchina? In tal caso: stai usando IIS o stai usando il server di sviluppo ASP.NET? Perché IIS e il server di sviluppo ASP.NET integrato in Visual Studio si comportano diversamente in determinate situazioni.

Inoltre: direttamente " saltando in " una posizione dell'array è considerata una cattiva pratica da molti sviluppatori (penso anche che non sia molto buono saltare semplicemente nell'array supponendo che ci sia la quantità corretta di elementi). Soprattutto quando si utilizzano matrici multidimensionali può diventare complicato quando si verificano errori. Ho visto molti codici complessi fallire sugli indici degli array e poiché non c'erano controlli, è stato abbastanza difficile eseguirne il debug (sto parlando di array di 5 o 6 dimensioni).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top