Pergunta

Talvez uma pergunta simples, mas eu realmente não sei o que fazer.

Quando eu enviar um arquivo por meio de um formulário usando <asp:FileUpload>, ele funciona perfeitamente em minha máquina dev.

Quando tento a mesma coisa no servidor, dá-me o erro abaixo. O erro não me ajuda em nada, porque eu nem sequer têm essa função no meu código (CaptureCollection) e eu não tenho uma variável chamada "i". Então, agora, eu realmente não sei.

Trata-se de uma questão de direito no servidor (eu não penso assim, porque eu dou todos os direitos possíveis e o erro ainda está lá), é algo no meu código (mas trabalhar na minha máquina dev .. .). Eu posso mostrar mais código se você precisa!

O erro:

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

Aqui está o código que faz o upload. E talvez você está certo com a regex. Mas por que é trabalhando em dev e não na 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;

}
Foi útil?

Solução

Você precisa postar seu código, mas para um tiro no escuro ...

No seu método de btnFinish_Click em sua página, há algo de errado com o local onde você está tentando usar uma expressão regular.

O mais provável é que você capturou um grupo de partidas RegEx e tentou enumerar através deles, quando não há realmente qualquer. (Ou você tem um loop For passando por mais itens do que a coleção / lista realmente tem.)

Editar: eu estou 99% certo que é logo após aqui:

Match m = r.Match(filepath);

Antes de fazer qualquer outra coisa, depois desta linha, verificar para ver se há nenhum grupo.

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

Então, veja se existem capturas desse grupo:

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

Finalmente você vai descobrir o que está acontecendo de errado com a entrada, fazendo isso, mas olhando para o código e não depuração ativamente isso, esta é a única boa maneira de descobrir.

Editar 2: A propósito, a razão de princípio que você está tendo esse problema é porque você realmente não validado a entrada antes de tentar usá-lo. O código que eu apenas deu como uma amostra irá ajudar a começar, mas você deve sempre higienizar o que está vindo para você.

Além disso, se você estiver usando um controle de upload, nem todos os navegadores irão passar em um caminho UNC completo para o arquivo (ou seja, \ server \ share \ file.ext) - alguns vão apenas passar no nome do arquivo, por si só, assim que estas são algumas coisas para verificar.

Outras dicas

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

O código presume existem os grupos. Por alguma razão (honestamente eu não tenho regex-fu) você não está recebendo os grupos você acha que deve sempre existir em produção. Eu tinha certeza que aqui é um m, há m.Groups e m.Groups.Count> = 2 e m.Groups [] tem capturas antes de chamar esses métodos.

Talvez o ambiente de produção coloca os arquivos em um local diferente. Tente verificar qual pasta o servidor de produção coloca seus arquivos e onde o desenvolvimento faz. Esses problemas acontecem frequentemente quando o desenvolvimento e ao vivo estão usando sistemas operacionais diferentes ou diferentes versões do IIS. Possivelmente a diferença no local de armazenamento faz com que seu reg-ex falhar. Eu não sou um regex pro então eu não sei se o seu regex pode conter um erro, mas esta é a primeira coisa que eu poderia pensar.

Além disso, é DEV sua própria máquina? Nesse caso: você está usando IIS ou você está usando o servidor de desenvolvimento ASP.NET? Porque o servidor de desenvolvimento ASP.NET integrado no Visual Studio comportam diferente em determinadas situações IIS e.

Além disso: diretamente "salto em" má-prática um local matriz é considerado por muitos desenvolvedores (Eu também acho que não é muito bom para apenas salto na matriz assumindo a quantidade correta de itens estão lá). Especialmente quando se utiliza múltiplas matrizes de dimensão pode ficar complicado quando ocorrem erros. Tenho visto muitos código complexo falhando em índices de matriz e porque não havia controlos que foi muito difícil para depurar-los (estou falando de 5 ou 6 matrizes de dimensão).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top