none
FileUpload perdendo a imagem ainda não salva RRS feed

  • Pergunta

  • Boa tarde,

    Estou com um FileUpload, que o usuário carrega uma imagem, tudo em uma página, porém acontece, que é feito a validação do email, caso o email já exista no banco de dados, ele informa uma mensagem, e limpa o campo txtemail, porém nessa hora, ele limpa a imagem se ela ainda não foi salva no banco de dados. 

    Segue como está o html do FileUpload: 

    <asp:UpdatePanel ID="UpdatePanel16" runat="server">
      <ContentTemplate>
        <span class="ImagenPerfil grid-16" runat="server">
                                            <asp:FileUpload ID="FileUpload1" runat="server" onchange="mostraImagem(this)" />
                                            <br />
                                            <asp:Image ID="imgImage" runat="server" Height="100px" />
                                        </span>
      </ContentTemplate>
    </asp:UpdatePanel>

    Existem outros campos textbox, e os mesmos não perdem os dados antes de serem salvos, somente no FileUpload, o que posso fazer pra isso não ocorrer, porque o button grava os dados, e salva a imagem, porém se o txtemail atualiza, ele perde a imagem, como proceder? Obrigado. 

    quinta-feira, 4 de janeiro de 2018 16:55

Respostas

  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 23 de janeiro de 2018 17:38
    Moderador

Todas as Respostas

  • Tenta usar UpdatePanel e persistir o valor do campo do upload

    Segue exemplo

    https://stackoverflow.com/questions/18651039/persist-fileupload-control-value

    Att

    quinta-feira, 4 de janeiro de 2018 17:39
  • Eu estou usando este exemplo pra gravar na sessão:

    protected void Page_Load(object sender, EventArgs e)
        {
            // store the FileUpload object in Session. 
            // "FileUpload1" is the ID of your FileUpload control
            // This condition occurs for first time you upload a file
             if (Session["FileUpload1"] == null && FileUpload1.HasFile)  
               { 
                Session["FileUpload1"] = FileUpload1; 
                Label1.Text = FileUpload1.FileName; // get the name 
               }
            // This condition will occur on next postbacks        
            else if (Session["FileUpload1"] != null && (! FileUpload1.HasFile)) 
              { 
                FileUpload1 = (FileUpload) Session["FileUpload1"]; 
                Label1.Text = FileUpload1.FileName; 
              } 
         //  when Session will have File but user want to change the file 
         // i.e. wants to upload a new file using same FileUpload control
         // so update the session to have the newly uploaded file
            else if (FileUpload1.HasFile) 
             { 
                Session["FileUpload1"] = FileUpload1; 
                Label1.Text = FileUpload1.FileName; 
             }
         }
    Porém como eu posso jogar o label1 depois no fileupload? Obrigado.

    quinta-feira, 4 de janeiro de 2018 18:34
  • Mariana,

    O UpdatePanel16 está dentro de outro UpdatePanel (componentes aninhados)?


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 4 de janeiro de 2018 18:37
  • Ele não está dentro de outro updatePanel não, somente neste do código, o Label salva o nome da foto, mas não retorna ela para fileupload. 
    quinta-feira, 4 de janeiro de 2018 19:08
  • Mariana,

    Acho que agora compreendi o problema. A validação do campo e-mail é no servidor, através do POST de todo formulário, certo? Caso sim, diferente dos demais tipos de INPUT, você não consegue preencher um INPUT FILE com um valor que vem do servidor (tipo um caminho local) e buscar este arquivo no computador do usuário. Seria uma brecha de segurança.

    Você tem algumas opções:

    • Guardar o conteúdo do arquivo em sessão e não apenas o caminho
    • Fazer a validação do e-mail utilizando Ajax ou em um UpdatePanel exclusivo, que não cause o envio do formulário por completo, só permitindo o click no submit se este campo estiver válido
    • Adicionar um campo INPUT HIDDEN e ao realizar o submit, preenche-lo com o conteúdo do arquivo em formato base64

    Das opções prefiro a segunda, utilizando Ajax. IMHO


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    sexta-feira, 5 de janeiro de 2018 10:01
  • Bom dia Juliano, segue como estou fazendo, esta é a função:

    <script type="text/javascript">
            $(document).ready(function () {
                function validateEmail(emailField) {
                    var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
    
                    if (reg.test(emailField) == false) {
                        document.getElementById('<%=txtEmail.ClientID%>').value = '';
                        alert('Email inválido.');
                        return true;
                    }
                    var btn = document.getElementById('<%=btnValidaEmail.ClientID%>');
                    btn.click();
    
                }
    
                $("[id$='txtEmail']").on('change', function () {
                    validateEmail($(this).val());
                })
            });
        </script>

    E essa é a função que fica dentro do linkbutton btnValidaEmail:

     SqlCommand cmd3 = new SqlCommand("SELECT email from pessoa where email ='" + txtEmail.Text + "' and id != '" + txtid.Text + "'", conConexao3);
    
                    SqlDataReader dr3 = cmd3.ExecuteReader();
    
                    if (dr3.HasRows == true)
                    {
                        if (dr3.Read())
                        {
                            veremail = true;
                            txtEmail.Text = "";
                            ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Email já existe em outro cadastro.');", true);
                        }
                    }

    Como posso proceder para não perder a imagem? De toda a forma que tento, eu perco a imagem quando ela ainda não foi salva no banco. Agradeço.

    sexta-feira, 5 de janeiro de 2018 10:43
  • O problema está no 

    btn.click();

    que provavelmente deve causar o submit da página. Se você puder optar por criar um Page Method (http://aspalliance.com/1922_PageMethods_In_ASPNET_AJAX.2) e fazer a validação usando Ajax ($.ajax no jQuery). Você conseguiria resolver.


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    sexta-feira, 5 de janeiro de 2018 10:53
  • Vou fazer o teste, e volto para informar o que ocorreu. Obrigado.
    segunda-feira, 8 de janeiro de 2018 11:07
  • Juliano estou tentando fazer, passando parâmetros, porém não está dando, lembrando que o txtid as vezes pode estar vazio.

    <script type="text/javascript">
            $(document).ready(function () {
                $('#btnValidaEmail').click(function () {
    
                    var obj = new Object();
                    obj.emailpessoa = $('#txtEmail').val();
                    obj.id_pessoa_email = $('#txtid').val();
    
                    var parametros = JSON.stringify(obj);
    
                    $.ajax({
                        type: 'post',
                        url: 'Pessoas.aspx/VerificaEmail',
                        contentType: "application/json; charset=utf-8",
                        data: parametros,
                        dataType: "json",
                        success: function (data) {/* em acaso de sucessos */
                            $("#resposta").text(data.d);
                        },
                        error: function (data) { /* caso haja algum erro */
                            $("#resposta").text(data.d);
                        }
                    }); return false;
                });
            });
        </script>

    E aqui a função:

     [WebMethod]
            public static string VerificaEmail(string emailpessoa, string id_pessoa_email)
            {
                string resposta = String.Empty;    
                clslogin pegaid = new clslogin();
                SqlConnection conConexao3 = clsdb.AbreBanco();
                if (id_pessoa_email != "0")
                {
                    clslogin log = new clslogin();
                    SqlCommand cmd3 = new SqlCommand("SELECT email from pessoa where email ='" + emailpessoa + "' and id != '" + id_pessoa_email + "'", conConexao3);
    
                    SqlDataReader dr3 = cmd3.ExecuteReader();
    
                    if (dr3.HasRows == true)
                    {
                        if (dr3.Read())
                        {
                            //txtEmail.Text = "";
                            resposta = "Email já existe em outro cadastro.";
                        }
                    }
                }
                else
                {
                    clslogin log = new clslogin();
                    SqlCommand cmd3 = new SqlCommand("SELECT email from pessoa where email ='" + emailpessoa + "'", conConexao3);
    
                    SqlDataReader dr3 = cmd3.ExecuteReader();
    
                    if (dr3.HasRows == true)
                    {
                        if (dr3.Read())
                        {
                            //txtEmail.Text = "";
                            resposta = "Email já existe em outro cadastro.";
                        }
                    }
                }
                return resposta;
            }

    Preciso que apareça o alert, informando a resposta, e preciso também que limpe o campo txtEmail, é a primeira vez que tento fazer dessa forma. Obrigado.

    terça-feira, 9 de janeiro de 2018 14:46
  • Mas ele dá algum erro? Verifique no Console via Developer Tools do navegador (F12).

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 9 de janeiro de 2018 15:55
  • Dá sim, ele retorna o seguinte erro,e não me retorna o alert.

    1. {Message: "Chamada de serviço da Web inválida, valor do parâmetro ausente: 'id_pessoa_email'.",…}
      1. ExceptionType:"System.InvalidOperationException"
      2. Message:"Chamada de serviço da Web inválida, valor do parâmetro ausente: 'id_pessoa_email'."
      3. StackTrace:" em System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters) ↵ em System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters) ↵ em System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams) ↵ em System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)"


    terça-feira, 9 de janeiro de 2018 16:08
  • Faça um teste desta forma para garantir que os valores não cheguem nulos ao WebMethod:

    var obj = {};
    obj.emailpessoa = '' + $('#txtEmail').val();
    obj.id_pessoa_email = '' + $('#txtid').val();
    
    var parametros = JSON.stringify(obj);


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 9 de janeiro de 2018 16:20
  • Fiz dessa forma, não me retorna erro, porém não acontece nada. 
    terça-feira, 9 de janeiro de 2018 16:26
  • Confira os IDs dos controles na tela e veja faça o debug via Developer Tools para verificar se a variável parametros está sendo gerada com os valores corretos.

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 9 de janeiro de 2018 16:29
  • Ele pega o email, mas não pega o txtid, mesmo com id vazio, ele devia informar se o email já existe. E não está ocorrendo. Outra coisa que está acontecendo é o postback da página, mesmo com esta função ocorre.
    terça-feira, 9 de janeiro de 2018 17:06
  • Como está o código HTML desta página?

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 9 de janeiro de 2018 17:50
  • Eu fiz o teste pegando o txtid correto Juliano, coloquei até um alert pra ver se ele entrava na função, e tudo ok, porém ele não me retorna o alert do sucesso ou do erro, e também ele atualiza a página, de qualquer das duas formas estou perdendo a imagem no FileUpload. Chamando o método pelo button, sem ser pelo WebMethod a função funciona corretamente, porém ocorre o postback, alguma sugestão?
    terça-feira, 9 de janeiro de 2018 18:10
  • Como está o HTML no seu arquivo .ASPX, Mariana?

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 9 de janeiro de 2018 20:48
  • Juliano, estou fazendo mais um teste para encerrar a perguntar, para tentar entender o que está ocorrendo, assim que tiver os resultados, posto. O meu html é muito grande para postá-lo inteiro. 
    quarta-feira, 10 de janeiro de 2018 19:32
  • Boa tarde, Mariana C. Costa.

    Conseguiu o que precisava?

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 12 de janeiro de 2018 18:25
    Moderador
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 23 de janeiro de 2018 17:38
    Moderador