Categorias
handler jquery multi-upload sess??o upload

Multi-Upload com ASP.NET usando JQuery e escrita na sess??o do Handler

Apesar do t??tulo grande e, para uns, confuso, nesse t??pico irei ajudar muitos a resolver um problema: m??ltiplos uploads de vez sem precisar selecionar cada arquivo.

A id??ia primordial ?? fazer com que o usu??rio possa clicar em um bot??o, selecionar v??rios arquivos de vez (que nem o GMail) e fazer o envio para uma pasta desejada. Para isso iremos utilizar um Handler em C# para fazer o upload. Mas nesse mesmo Handler irei escrever na sess??o para que possa utilizar em outra p??gina. Lembrando que as vari??veis de sess??o, para usar dentro de um Handler precisa-se de um artif??cio. Sem mais delongas, vamos ?? solu????o.

Crie ou abra um Web Site Project e nele adicione um Generic Handler. Coloque com o nome Upload.ashx para ficar mais f??cil de encontr??-lo. Insira o seguinte c??gido:

using System;
using System.Data;
using System.IO;
using System.Web;
using System.Web.SessionState;

public class Upload : IHttpHandler, IRequiresSessionState{

        public void ProcessRequest (HttpContext context) {
                context.Response.ContentType = “text/plain”;
                context.Response.Expires = -1;
                try
                {
                        // Obt??m o arquivo a ser postado
                        HttpPostedFile postedFile = context.Request.Files[“filedata”];
                        // Caminho
                        string path = context.Server.MapPath(“~/Upload/”);
                        string filename = postedFile.FileName;
                        // Cria diret??rio de n??o existir
                        if (!Directory.Exists(path))
                                Directory.CreateDirectory(path);
                        // Verifica se o arquivo j?? existe com mesmo nome
                        string nome = filename.Substring(0, filename.LastIndexOf(“.”));
                        string extensao = filename.Substring(filename.LastIndexOf(“.”) + 1);
                        int i = 1;
                        // Verifica se existe, sen??o renomeia
                        while (File.Exists(path + @”” + filename))
                        {
                                filename = nome + “(“ + i + “).” + extensao;
                                i++;
                        }
                        // Adiciona na sess??o
                        DataTable galeria = (DataTable)context.Session[“galeria”];
                        DataRow item = galeria.NewRow();
                        item[“imagem”] = filename;
                        galeria.Rows.Add(item);
                        context.Session[“galeria”] = galeria;
                        // Salva arquivo
                        postedFile.SaveAs(path + @”” + filename);
                        // Retorna o arquivo salvo
                        context.Response.Write(path + “/” + filename);
                        context.Response.StatusCode = 200;
                }
                catch (Exception ex)
                {
                        context.Response.Write(“Erro: “ + ex.Message);
                }
        }


        public bool IsReusable {
                get {
                       return true;
                }
        }

}
 
Pronto! J?? temos nosso Handler que faz o upload de um arquivo e o adiciona em um DataTable. Esse DataTable j?? estava previamente adicionado na sess??o. Voc?? pode utilizar quaisquer outra estrutura para armazenar. A dica da escrita na sess??o no Handler est?? na heran??a da interface IRequiresSessionState onde permitir?? fazer isso.
 
Crie uma p??gina ASPX e referencie os JavaScripts do JQuery abaixo (os arquivos, caso n??o possuam, irei disponibilizar em um link abaixo) e um CSS pra dar um estilo legal:

<link rel=”stylesheet” type=”text/css” href=”css/stilo.css” />
<script type=”text/javascript” src=”js/jquery-1.3.2.min.js”></script>
<script type=”text/javascript” src=”js/jquery.uploadify.js”></script>

Agora adicione um controle FileUpload e um link (ou um controle HyperLink). Iremos tamb??m fazer a chamada do JQuery para ser aplicado sobre o FileUpload ficando dessa forma:

<asp:FileUpload ID=”Fotos” runat=”server” />
<input type=”button” onclick=”javascript:$(‘#<%=Fotos.ClientID%>‘).fileUploadStart();” value=”Enviar” />
<script type=”text/javascript”>
$(window).load(
       function() {
       $(“#<%=Fotos.ClientID %>”).fileUpload({
           ‘uploader’: ‘js/uploader.swf’,
           ‘cancelImg’: ‘imagens/cancelar.png’,
           ‘buttonText’: ‘Selecionar’,
           ‘script’: ‘Upload.ashx’,
           ‘folder’: ‘Upload’,
           ‘fileDesc’: ‘Selecione arquivos do tipo imagem’,
           ‘fileExt’: ‘*.jpg;*.jpeg;*.gif;*.png’,
           ‘multi’: true,
           ‘auto’: false
       });
      }
);
</script>

Agora rode a aplica????o. Ver?? apenas um bot??o com o nome Selecionar. Ao clicar ir?? abrir um pop-up pedindo para selecionar os arquivos. Selecione um ou mais e clique em OK. Ver?? que ser?? montado uma lista com os arquivos que ir??o ser enviados. Voc?? poder?? remover itens clicando no X sobre cada um deles. Ao clicar no link Enviar, ser?? feito uma chamada para cada item sobre o Handler fazendo o envio para a pasta Upload e adicionando no DataTable armazenado na sess??o.

N??o vou entrar muito em datelhes, porque est?? bem f??cil e compreens??vel o c??digo. Se desejar, ao inv??s de clicar em Enviar para fazer o envio, voc?? pode deixar autom??tico (como se fosse uma trigger) mudando o par??metro ‘auto’ para true da chamada JQuery. Ent??o, ao selecionar e clicar em OK automaticamente ser?? feito o upload. Se tamb??m quiser que o link fa??a um PostBack na p??gina, basta colocar depois da chamada de in??cio do upload, insira o __doPostBack(”,”); colocando par??metro ou n??o dependendo do que for fazer com ele ap??s.

Nesse link aqui encontram-se alguns arquivos necess??rios para que possam utilizar. N??o vou colocar os fontes ASP.NET porque sen??o j?? seria demais, n??? M??os ?? obra…

Obs: a fonte e outras mat??rias sobre o mesmo t??pico voc?? acha a?? pela net. N??o me lembro qual site eu havia visto algo do tipo e fiz essa. Mas fica a dica a??!

14 respostas em “Multi-Upload com ASP.NET usando JQuery e escrita na sess??o do Handler”

Raul, n??o notei a diferen??a no desempenho pois n??o fiz um teste de carga. Posso fazer depois e lhe dar um retorno, mas creio que, para aplica????es pequenas que demandam uma vez ou outra esse tipo de chamada, n??o deve ter um impacto muito grande na aplica????o. Obrigado pela d??vida…

Ol?? Thiago…
Excelentes suas dicas…
Usei seu exemplo, com algumas altera????es, mas estou tendo um probleminha…
Alterei para fazer upload de arquivos .txt e .mdb…
Os txt ele upa de boa, mas os mdb d?? mensagem de IO error…
pode me dar uma luz?

Veja qual o tamanho da base MDB que est?? enviando e as permiss??es na pasta de destino. No web.config aplique:

Para aumentar o tempo e o tamanho dos arquivos enviados. Teste novamente e se n??o conseguir me envie mais detalhes do erro e/ou rastreamento da pilha…

Obrigado pela informa????o. Isso mais o codigo que tenho pra redimensionar a imagem ANTES do upload, no lado do cliente, ficou perfeito!

Valeu

Thiago bom dia,

muito bom o artigo. Implementei do jeito como mandou o figurino. Sendo que ele, por algum motivo nao faz o upload do(s) arquivo(s). O mais estranho ?? que ele no debug d?? tudo certo, tanto que indica o caminho, o streaming, tamanho do arquivo. O que poderia ser?

Claudinei,
D?? permiss??o de escrita para o usu??rio Todos (Everyone) na pasta onde ir?? armazenar os uploads e tente novamente. Veja nos coment??rios acima algumas das solu????es para esse caso. Se n??o conseguir, me envie seu c??digo para verifica????o e teste.

Thiago, parab??ns pelo excelente c??digo.
Estou implementando em meu site, mas esbarrei em um problema: ao limitar o tamanho do arquivo utilizando a propriedade "sizeLimit" recebo o aviso "File size error" corretamente, mas a?? n??o consigo mais excluir utilizando o ??cone correspondente. N??o d?? erro, apenas n??o exclui.
Vc pode me ajudar? Aproveitando essa mensagem ?? do meu sistema operacional? Posso configura-la para portugu??s?

??timo artigo! Me ajudou muito, por??m, s?? consigo fazer o upload com a aplica????o rodando local. Quando jogo em um servidor ftp, sempre d?? erro. Tento mandar usando stream, mas n??o localiza o arquivo na m??quina. Tento usar o SaveAs(), mas n??o aceita salvar no servidor.
Voc?? sabe o que pode ser?

Deixe um comentário para Zanella Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *