Pregunta

Tal vez una pregunta simple pero realmente no sé qué hacer.

Cuando envío un archivo a través de un formulario usando <asp:FileUpload>, funciona perfectamente en mi máquina de desarrollo.

Cuando intento lo mismo en el servidor, me da el siguiente error. El error no me ayuda en absoluto porque ni siquiera tengo esta función en mi código  (CaptureCollection) y no tengo una variable llamada & Quot; i & Quot ;. Así que en este momento, realmente no lo sé.

¿Es una cuestión de derecho en el servidor (no lo creo porque doy todos los derechos posibles y el error sigue ahí), es algo en mi código (pero funciona en mi máquina de desarrollo ... .). ¡Puedo mostrar más código si lo necesitas!

El error:

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

Aquí está el código que realiza la carga. Y tal vez tengas razón con la expresión regular. Pero, ¿por qué funciona en desarrollo y no en producción?

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;

}
¿Fue útil?

Solución

Tendrá que publicar su código, pero para una toma en la oscuridad ...

En su método btnFinish_Click en su página, hay algo mal con el lugar donde está tratando de usar una expresión regular.

Lo más probable es que haya capturado un grupo de coincidencias RegEx e intentado enumerarlas, cuando realmente no hay ninguna. (O tiene un bucle For pasando por más elementos de los que realmente tiene la colección / lista).

Editar: estoy 99% seguro de que es justo después de aquí:

Match m = r.Match(filepath);

Antes de hacer cualquier otra cosa, después de esta línea, verifique si hay algún grupo.

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

Luego, vea si hay capturas en ese grupo:

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

En última instancia, descubrirá qué está mal con la entrada haciendo esto, pero mirando el código y no depurando activamente esto, esta es la única buena manera de averiguarlo.

Edición 2: Por cierto, la razón, en principio, de que tienes este problema es porque realmente no has validado la entrada antes de intentar usarla. El código que acabo de dar como muestra lo ayudará a comenzar, pero siempre debe desinfectar lo que viene a usted.

Además, si está utilizando un control de carga, no todos los navegadores pasarán una ruta UNC completa al archivo (es decir, \ server \ share \ file.ext); algunos simplemente pasarán el nombre del archivo por sí mismos, así que estas son algunas cosas para verificar.

Otros consejos

  

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

Su código supone que los grupos existen. Por alguna razón (sinceramente, no tengo regex-fu) no estás obteniendo los grupos que crees que siempre deberían existir en la producción. Me aseguraría de que aquí hay una m, hay m.Groups y m.Groups.Count & Gt; = 2 y m.Groups [] tiene capturas antes de llamar a esos métodos.

Quizás el entorno de producción coloca los archivos en una ubicación diferente. Intente verificar en qué carpeta coloca el servidor de producción sus archivos y dónde lo hace el desarrollo. Estos problemas ocurren con frecuencia cuando el desarrollo y live utilizan diferentes sistemas operativos o diferentes versiones de IIS. Posiblemente, la diferencia en la ubicación de almacenamiento hace que su reg-ex falle. No soy un experto profesional, así que no sé si su expresión regular podría contener un error, pero esto es lo primero que se me ocurre.

Además, ¿es DEV su propia máquina? En ese caso: ¿está utilizando IIS o está utilizando el servidor de desarrollo ASP.NET? Porque IIS y el servidor de desarrollo ASP.NET integrado en Visual Studio se comportan de manera diferente en ciertas situaciones.

También: directamente " saltando a " muchos desarrolladores consideran que una ubicación de matriz es una mala práctica (también creo que no es muy bueno simplemente saltar a la matriz suponiendo que haya la cantidad correcta de elementos). Especialmente cuando se utilizan matrices multidimensionales, puede ser complicado cuando se producen errores. He visto fallar muchos códigos complejos en los índices de matriz y debido a que no hubo verificaciones, fue bastante difícil depurarlos (estoy hablando de matrices de 5 o 6 dimensiones).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top