Question

Peut-être une simple question mais je ne sais vraiment pas quoi faire.

Lorsque je soumets un fichier via un formulaire à l'aide de <asp:FileUpload>, cela fonctionne parfaitement sur ma machine de développement.

Lorsque j'essaie la même chose sur le serveur, l'erreur ci-dessous est générée. L'erreur ne m'aide pas du tout parce que je n'ai même pas cette fonction dans mon code  (CaptureCollection) et je n'ai pas de variable appelée & "I &" ;. Alors pour le moment, je ne sais vraiment pas.

Est-ce une question de droit sur le serveur (je ne pense pas parce que je donne tous les droits possibles et que l'erreur est toujours là), est-ce quelque chose sur mon code (mais cela fonctionne sur ma machine dev .. .) Je peux montrer plus de code si vous avez besoin!

L'erreur:

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

Voici le code qui effectue le téléchargement. Et peut-être que vous avez raison avec la regex. Mais pourquoi travaille-t-il sur dev et non sur 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;

}
Était-ce utile?

La solution

Vous aurez besoin de poster votre code, mais pour un coup dans le noir ...

Dans votre méthode btnFinish_Click sur votre page, il y a un problème avec l'endroit où vous essayez d'utiliser une expression régulière.

Très probablement, vous avez capturé un groupe de correspondances RegEx et essayé de les énumérer, alors qu’il n’y en a pas vraiment. (Ou vous avez une boucle For parcourant plus d'éléments que la collection / liste n'en a réellement.)

Modifier: Je suis sûr à 99% que c'est juste après:

Match m = r.Match(filepath);

Avant de faire quoi que ce soit, après cette ligne, vérifiez s'il y a des groupes.

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

Ensuite, voyez s'il y a des captures dans ce groupe:

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

En fin de compte, vous découvrirez ce qui ne va pas avec l'entrée, mais en regardant le code sans le déboguer activement, c'est le seul bon moyen de le savoir.

Éditer 2: En passant, la raison en principe de ce problème est que vous n'avez pas vraiment validé l'entrée avant d'essayer de l'utiliser. Le code que je viens de donner comme exemple vous aidera à démarrer, mais vous devez toujours clarifier ce qui vous arrive.

De même, si vous utilisez un contrôle de téléchargement, tous les navigateurs ne transmettront pas un chemin UNC complet au fichier (c.-à-d. \ serveur \ partage \ fichier.ext). Certains ne feront que passer le nom du fichier lui-même. donc ce sont des choses à vérifier.

Autres conseils

  

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

Votre code suppose que les groupes existent. Pour une raison quelconque (honnêtement, je n'ai pas de regex-fu), vous ne recevez pas les groupes qui, selon vous, devraient toujours exister lors de la production. Je m'assurerais qu'il s'agit d'un m, il y a m.Groups et m.Groups.Count & Gt; = 2 et que m.Groups [] a des captures avant d'appeler ces méthodes.

Peut-être que l'environnement de production place les fichiers à un emplacement différent. Essayez de vérifier quel dossier le serveur de production place ses fichiers et où se trouve le développement. Ces problèmes se produisent fréquemment lorsque le développement et la mise en production utilisent différents systèmes d'exploitation ou différentes versions d'IIS. Peut-être la différence d'emplacement de stockage entraîne l'échec de votre reg-ex. Je ne suis pas un professionnel de l’exercice, je ne sais donc pas si votre regex peut contenir une erreur, mais c’est la première chose à laquelle je puisse penser.

Aussi, DEV est-il votre propre machine? Dans ce cas, utilisez-vous IIS ou utilisez-vous le serveur de développement ASP.NET? IIS et le serveur de développement ASP.NET intégré à Visual Studio se comportent différemment dans certaines situations.

Aussi: directement " sauter dans " de nombreux développeurs considèrent qu’un emplacement sur un tableau est une mauvaise pratique (je pense aussi qu’il n’est pas très bon de simplement sauter dans le tableau en supposant que la quantité correcte d’éléments y figure). Surtout lorsque vous utilisez des tableaux multi-dimensions, cela peut être délicat lorsque des erreurs se produisent. J'ai vu de nombreux codes complexes échouer sur les index de tableaux et, en l'absence de vérifications, il était assez difficile de les déboguer (je parle de tableaux à 5 ou 6 dimensions).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top