Como corrigir Class com metodo Upload

20/02/2009

Olá Consultores DevMedia Criei a seguinte Classe   using System; using System.Configuration; using System.Web; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI; using System.IO; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Text; using System.Drawing.Drawing2D; using System.Text;     namespace namespace.UploadClass { public class UploadClass { static string nomeUpload; static string nomedoarquivo; static string IDControle; static Label IDLabelControle; static string exibirpath; static string filetxt; //static string filetxtcancel; static string filematriz; //static string pastafiltercancel; static string subpathcaminho; //static string subpathcaminhocancel; static string cancelafiles; static string cancelacaminhofiltrado; //static string exibirpathfilter; static string exibirpathmatriz; static string caminhovirtual; static string filetxtRetornaCaminho; static string outrocaminho; //static string deletado; //static string deletadofilter; //static string nomedoarquivofilter; // static string nomedoarquivorename; //static string lastfolder; //static string caminhoorigem; //static string separador; //static string [] separadorsplit; //static string folder; // static string folderprevious; public void FileUpload(FileUpload IDUpload, string file, string pathmatriz, string pathfilter, string ext, int width, int height, bool RenameWH, Label IDLabel, string bgcolornotimg) { pathmatriz = pathmatriz.Replace(@"\", "/"); nomeUpload = file.Replace("." + ext, Convert.ToString(width) + Convert.ToString(height) + "." + ext); filematriz = file; IDLabel.Text = ""; //Início Método Para RetornarCaminho DirectoryInfo pasta = new DirectoryInfo(pathfilter.Replace(@"\", "/")); filetxtRetornaCaminho = pasta.ToString().Replace(pathfilter, string.Empty); //NomeArquivo.Txt outrocaminho = HttpContext.Current.Request.PhysicalApplicationPath; outrocaminho = outrocaminho.Replace(@"\", "/"); outrocaminho = filetxtRetornaCaminho.Replace(outrocaminho, string.Empty); //HttpContext.Current.Response.Write("~/" + outrocaminho + "notfoundimg.png"); caminhovirtual = "~/" + outrocaminho + "notfoundimg." + ext; //Fim do Método RetornaCaminho if (IDUpload.HasFile != false) //Verifica se Arquivo foi Uploadado ou não Retornando True ou False { if (IDUpload.PostedFile.ContentLength < 4096)//Método que verifica se Arquivo é maior que 4096 kbs(4mb) { //Verifica se Diretorio já existe if (Directory.Exists(pathmatriz)) { //Response.Write("<br/>" + FileUpload1.PostedFile.ContentLength); IDUpload.SaveAs(pathmatriz + "\\" + file); IDLabel.Text = ("Arquivo Enviado com Sucesso!!!"); } else { //Cria Diretorio Directory.CreateDirectory((pathmatriz)); //Response.Write("<br/>" + FileUpload1.PostedFile.ContentLength); IDUpload.SaveAs(pathmatriz + "\\" + file); IDLabel.Text = ("Arquivo Enviado com Sucesso!!!"); } } else { //se maior que 4 mb impede inserção do arquivo //e emite msg IDLabel.Text = "Arquivo maior que 4 Mb!!!Favor Inserir Arquivo menor!!!"; } } else { IDLabel.Text = ("Favor Inserir um Arquivo!!!"); } //HttpContext.Current.Session["cancelcaminhofilter"] = cancelacaminhofiltrado; }   No codigo de meu source que consome á class está assim using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using namespace.UploadClass; using System.IO; namespace UploadClassTeste { public partial class _Default : System.Web.UI.Page { public string nomeArquivo; public string caminhoMatriz; public string caminhoTransformed; protected void Page_Load(object sender, EventArgs e) {   nomeArquivo = FileUpload1.FileName.ToString(); caminhoMatriz = Server.MapPath("~/upload1/"); caminhoTransformed = Server.MapPath("~/upload2/"); //string caminhopath = Server.MapPath("~/uploadtransformed/").Replace(Server.MapPath("~/uploadtransformed/"), Server.MapPath).ToString(); int width = 50; int height = 50; string extensao = "png"; string color = "#FFFFFF"; UploadClass carregaArquivo = new UploadClass();   carregaArquivo.FileUpload(FileUpload1, nomeArquivo, caminhoMatriz, caminhoTransformed, extensao, width, height, true, Label1, color); lblArqMatriz.Text = carregaArquivo.GetDisplayFile(); lblResultado.Text = carregaArquivo.GetDisplayImage(); lblCaminhoImage.Text = carregaArquivo.GetDisplayPathImage(); lblCaminhoImage.Visible = false; Image1.ImageUrl = carregaArquivo.GetDisplayPathImage(); } } } O problema que ocorre na execução é que qdo eu posto um arquivo inferior á 4mb como é verificado ná linha if (IDUpload.PostedFile.ContentLength < 4096)//Método que verifica se Arquivo é maior que 4096 kbs(4mb)     de minha classe apesar de ele uploadar o arquivo corretamente ele mostra a mensagem   IDLabel.Text = "Arquivo maior que 4 Mb!!!Favor Inserir Arquivo menor!!!";   que só deveria sêr mostrada caso a condição não fosse satisfeita ou seja se o arquivo uploadado fosse maior de 4mb mas ele mostra essa msg de qq jeito mesmo qdo eu faço o upload de um arquivo com menor tamanho de 4mb   Fico no aguardo e desde já agradeço caso possa me orientar á corrigir    
Luiz Franco

Luiz Franco

Curtidas 0

Respostas

[devmedia .net]

[devmedia .net]

20/02/2009

Olá Luiz, beleza ??   Bom para resolver seu problema você deve alterar o tamanho máximo, você está informando errado, pois o tamanho máximo é medido em bytes, e para representar 4MB você deve fazer a seguinte conta...       int maxSize = 4194304; //1 megabyte = 1 048 576 bytes Só isso... pode alterar que vai funcionar..
Outra dica, sempre limpe o valor do Label que mostra a mensagem de sucesso ou erro no envio do arquivo, você pode fazer isso no Post da página.   Abraços   Aguardo seu retorno..   Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

Como assim no código que eu postei eu representaria em código isso baseado em diversos tamanhos de megabytes , teria tambem alguma formula para eu saber o numero de bytes de 4mb será que 4096 que eu coloquei em meu código representa 4mb (teria uma tabela ou formula que representa-se pra mim então de 1mb, 2mb,4mb,5mb, 10  e 20mb) Fico no aguardo e desde já agradeço
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Olá, Luiz , tranquilo ??     1MB corresponde a 1 048 576 bytes,   Estou lhe falando isso pois já existem vários problemas relacionados a esse problema..   Poderá ver o valor retornado se colocar um breakpoint no FileUpload quando carregar o arquivo e ver o valor do ContentLeght, ele mostra os bytes com várias casas e não apenas 4 (4096) , ele sempre retorna algo do tipo 4059687 , sacou !? Se colocar 4096 sempre será menor... e não passará no seu teste.   Veja a tabela do site .. Você mesmo pode confirmar: http://www.123marbella.net/en/free-bandwith-calculator.html     Aguardo retorno para conclusão do chamado..   Grande Abraço meu amigo..   Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

Carlos ainda a respeito de corrigir Class com metodo Upload, surgiu uma nova duvida que segue abaixo     Tenho a minha class que recebe   public void FileUpload(FileUpload IDUpload, string file, string pathmatriz) { ....conteudo da class   //Aqui tenho um metodo protected void   Tamanho(file)   ....conteudo da class } protected void Tamanho(string arqtransformed) { //O metodo capitura o Arquivo Matriz uploadado e o transforma e salva pelo System.Drawing System.Drawing.Image myImg = System.Drawing.Image.FromFile(arqtransformed); transformed.Save(arqtransformed); //Para uso com o Método DelFileFilter (Arq.Filtrado) // Abre o arquivo C:\SeuArquivo.txt em modo escrita, a partir do final StreamWriter DF = new StreamWriter(foldertransformed + "DF.txt", true); using (DF) { // Escreve uma nova linha no final do arquivo DF.WriteLine(nomeUpload.ToString()); } } //Só que o mesmo método não reconhece o arquivo uploadado como Image, que tipo de objeto para o que estou pretendendo tenho que usar para que ele reconheca o nome do arquivouploadado que está no meu método publico principal FileUpload, fico no aguardo e se puder me ajudar desde já agradeço..no caso do exemplo anterior consegui resolver o maxsize , mas se possivel ainda aguardo se haveria alguma forma de calculo ou se o ContentLenght qdo a pessoa posta já traz o arquivo em Mbites
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Ok, Luiz... Não entendi exatamente o que está querendo fazer com a imagem.. Poderia se mais específico ?   Quanto ao ContentLenght do FileUpload, não há como trazer como MB somente da maneira que está sendo trazido... Lhe enviei um link onde você faz as contas de MB para Bytes , você viu .. não tem outro jeito é daquela forma mesmo...   Aguardo seu contato... Preciso saber o que pretende fazer com a imagem..   Abraços   Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

CARLOS boa tarde, o que eu queria seria exatamente isso no code behind da pagina que recebe a minha class tem um objeto fileupload que recebe o arquivo e repassa ao metodo   tanto no evento page load como no evento button click   nomeArquivo = FileUpload1.FileName.ToString(); caminhoMatriz = Server.MapPath("~/uploadfonte/"); caminhoTransformed = Server.MapPath("~/uploadresize/");   int width = 50; int height = 50; string extensao = "png"; string color = "#FFFFFF"; UploadCustomBas carregaArquivo = new UploadCustomBas(); //carregaArquivo.FileUpload(FileUpload1, nomeArquivo, caminhoMatriz, caminhoTransformed, extensao, width, height, Label1); carregaArquivo.FileUpload(FileUpload1, nomeArquivo, caminhoMatriz, caminhoTransformed, extensao, width, height, true, Label1, color); Dentro da minha classe no metodo FileUpload eu tenho     public void FileUpload(FileUpload IDUpload, string file, string pathmatriz) { if (IDUpload.HasFile != false) //Verifica se Arquivo foi Uploadado ou não Retornando True ou False { if (IDUpload.PostedFile.ContentLength < maxsize)//Método que verifica se Arquivo é maior que 4096 kbs(4mb) { //Response.Write("<br/>" + FileUpload1.PostedFile.ContentLength); IDUpload.SaveAs(pathmatriz + "\\" + file); HttpContext.Current.Response.Write(file);   //Inicio Metodo de Filtros //Filtro AddIn TransformedResize Tamanho(width, height, file);//Nesta linha o nome do arquivo uploadado que será transformado tem que passar para o atributo file (só que eu não sei se o objeto que recebe no metodo tamanho para sêr transformado tem que sêr recebido como do tipo string ou do tipo objeto para ele sêr transformado dentro do metodo na linha do metodo que está marcada abaixo como recebe nomedoarquivouploadado //Fim dos Filtros; IDLabel.Text = ("Arquivo Enviado com Sucesso!!!"); }   } } protected void Tamanho(int width, int height, string arqtransformed) { //O metodo capitura o Arquivo Matriz uploadado e o transforma e salva pelo System.Drawing System.Drawing.Image myImg = System.Drawing.Image.FromFile(arqtransformed); //recebe o nome do arquivo uploadado consumido em string arqtransformed , só que ele  não reconhece o nome do arquivo para transformar seria por ele ser tipo string, se for para qual tipo tenho que converter e como fazer a atribuição á ele no metodo fileupload? transformed.Save(arqtransformed); //Para uso com o Método DelFileFilter (Arq.Filtrado) // Abre o arquivo C:\SeuArquivo.txt em modo escrita, a partir do final StreamWriter DF = new StreamWriter(foldertransformed + "DF.txt", true); using (DF) { // Escreve uma nova linha no final do arquivo DF.WriteLine(nomeUpload.ToString()); } }   As duvidas estão nos coments dentro dos metodos, fico no aguardo e caso possa me ajudar desde já agradeço O erro que ele dá é este System.IO.FileNotFoundException was unhandled by user code
  Message="arquivouploadado.png"
  Source="System.Drawing"
  StackTrace:
       em System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
       em System.Drawing.Image.FromFile(String filename)
       em NameSpace.Upload.UploadCustomBas.TransformedResize(Int32 width, Int32 height, String arqtransformed) na D:\MeusComponentesDLLsFontes\UploadCustomBas1002\Upload\UploadCustomBas.cs:linha 418
       em NameSpace.Upload.UploadCustomBas.FileUpload(FileUpload IDUpload, String file, String pathmatriz, String pathfilter, String ext, Int32 width, Int32 height, Boolean RenameWH, Label IDLabel, String bgcolornotimg) na D:\MeusComponentesDLLsFontes\UploadCustomBas1002\Upload\UploadCustomBas.cs:linha 153
       em UploadCustomBasTeste._Default.Page_Load(Object sender, EventArgs e) na D:\MeusComponentesDLLsTeste\UploadCustomBasTeste\UploadCustomBasTeste\Default.aspx.cs:linha 37
       em System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
       em System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
       em System.Web.UI.Control.OnLoad(EventArgs e)
       em System.Web.UI.Control.LoadRecursive()
       em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Luiz, eu vi o código, e volto a lhe perguntar.. Preciso que seja mais claro para que eu não fique lhe respondendo coisas que não seja o que deseja.   O que você deseja exatamente..   Redimensionar a imagem ? Mostrá-la ? Mudar de lugar ?   Pois pelo seu método dá para fazer muita coisa...   No aguardo.. Grande Abraço   Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

É para redimensionar a imagem mas o que eu quero é que na mesma hora que se faça o posted file do metodo principal por exemplo seja pego o arquivo dentro do metodo o que eu quero seria exatamente isto Como passo um arquivo Uploadado de um Método Principal p/um método secundário (mas de forma automática ou seja na mesma hora que ele faz o upload e pega o arquivo no metodo principal que ele consuma esse mesmo arquivo já uploadado no método secundário embutido no principal, como o exemplo que segue, o método secundário é um método pra redimensionamento de arquivo usando o System.Drawing, mas não sei o pq ele não está capturando a img uploadada do método principal é por isso que preciso tirar essa duvida para evitar de colocar o codigo deste metodo secundário de uma forma direta no metodo principal, seria isso) Me desculpe se as perguntas são de iniciante, mas como não estou conseguindo deste jeito é por isso que estou perguntando   Olá tenho o seguinte metodo principal em minha ClassLibrary

public void FileUpload(FileUpload IDUpload, string file, string pathfilter) {
  //Dentro após a rotina de Upload do Arquivo
    IDUpload.SaveAs(pathfilter + "\\" + file); Tenho o seguinte método secundário que tem por objetivo obter o nome do arquivo uploadado e colocá-lo no método Tamanho

 int width = 50;
int height = 50 Tamanho(width, height, file);
}

O método Protected void Tamanho tem a seguinte linha de comando

protected void Tamanho(int width, int height, string arqtransformed) { ///Inicio das Rotinas de Filters   ///Uso do Filtro Basico Resize   ///----------------------------   //Inicio do uso do Filtro   System.Drawing.Image tamanho; //Captura o Caminho+Arquivo Carregado   System.Drawing.Image myImg = System.Drawing.Image.FromFile(arqtransformed);//Só que não sei por qual motivo ele não reconhece nesta linha o arquivo uploadado no método principal



}

O que eu estou precisando saber é como fazer com que ele reconheca na mesma hora que se fáz o posted file e salvamento do arquivo, como ele reconhecer este mesmo arquivo nesta linha do metodo

System.Drawing.Image myImg = System.Drawing.Image.FromFile(arqtransformed);//

Fico no aguardo e se alguem pd me ajudar desde já agradeço
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Oi Luiz, tudo bem ? Bom cara, só existem 3 possíbilidades de erro no seu código...   1° Seu arquivo não está sendo salvo 2° Seu arquivo está sendo salvo com nome diferente 3° O Endereço do arquivo onde está salvando está diferente de onde está buscando   Não existe outra possibilidade.. Bom para verificar isso você pode colocar um breakpoint no lugar onde salvo o arquivo e conferir o local onde está sendo salve e também verificar o nome do arquivo e o endereço onde está buscando.. Pois pelo que eu vejo você está mudando a extensão do arquivo, não por querer, mas quando coloca um outro nome do arquivo precisar ser passado também a extensão. Com certeza é um detalhe bobo, pois não vejo erro no seu código, bom não estou rodando ele, mas aparenta estar tudo certo.   Caso ainda não consigo verificar isso, por favor me envie seu projeto para que eu possa fazer a simulação e descobrir onde está o erro.. Você precisaria me enviar os códigos que você salva o arquivo, e os parâmetros que está passando para que eu possa tentar simular o mais parecido com seu ambiente.   No aguardo..   Abraços   Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

Olá Carlos, pelo menos nesta parte você tinha razão mas não tinha nada a haver com a extensão do arquivo, tinha a haver com o caminho e nome do arquivo   No from file  (ele estava recuperando só o nome do arquivo e o caminho estava como pathfisico e não relativo), corrigi isso criando a rotina abaixo   //Início Método Para RetornarCaminhoMatriz DirectoryInfo pasta = new DirectoryInfo(pathmatriz.Replace(@"\", "/")); filetxtRetornaCaminho = pasta.ToString().Replace(pathmatriz, string.Empty); //NomeArquivo.Txt outrocaminhomatriz = HttpContext.Current.Request.PhysicalApplicationPath; outrocaminhomatriz = outrocaminhomatriz.Replace(@"\", "/"); outrocaminhomatriz = filetxtRetornaCaminho.Replace(outrocaminhomatriz, string.Empty);   e dentro da linha do imgfromfile assim o corrigi System.Drawing.Image myImg = System.Drawing.Image.FromFile(HttpContext.Current.Server.MapPath("~/" + outrocaminhomatriz + filematriz)); e outro erro que vi é que estava usando o mesmo caminho e arquivo de entrada para o caminho arquivo de saida o que dá erro de gdi se não me engano , ou seja não estava usando o caminho e arquivo renomeado ou de transformação resolvi isso desta forma   Para capturar o caminho e arqrenomeado   //correção do caminho do arq á transformar string patharqtransformed = HttpContext.Current.Request.PhysicalApplicationPath; patharqtransformed = patharqtransformed.Replace(@"\", "/"); arqtransformed = arqtransformed.Replace(@"\", "/"); arqtransformed = arqtransformed.Replace(patharqtransformed, string.Empty);   e no salvamento do filtro coloquei transformed.Save(HttpContext.Current.Server.MapPath("~/"+arqtransformed)); Na linha do metodo mudei o que estava anteriormente e coloquei   protected void Tamanho(int width, int height,string pathmatriz, string pathfilter, string arqtransformed) {     }   Com isso a parte do filtro eu consegui corrigir, mas vc tinha razão éra o nome do caminho e arquivo que estava sendo passado errado pois eu tava colocando o mesmo caminho e arquivo do transformado qdo tinha que ser o do matriz esse éra um outro erro que tb verifiquei   Bem aproveitando e se não for pedir muito gostaria de saber se existe alguma forma de qdo o arquivo é uploadado  de ele ficar na memória, explico é que no mesmo metodo ou componente que estou criando quero criar um metodo de cancelamento de arquivo, só que na hora de ele cancelar ele exclui tb o arquivo que já estaria sendo uploadado e usado (a diferença é que esse metodo não da pra ser usado no mesmo evento do click do botão enviar do upload, é por isso que ele tem que ficar guardado em alguma variavel de memoria ou algo assim até sêr substituido por um novo arquivo uploadado)   Fico no aguardo e desde já agradeço
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Oi, Luiz que bom que resolveu seu problema.. Jogue em Session , isso resolverá seu problema mas lembre que isso não é uma boa prática, pois os arquivos são grandes e isso "entope" a memória do servidor, comprometendo todo o sistema.   Abraços   Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

Mas sem sêr em Session não existe outra alternativa, já que será acionado o metodo em evento diferente ao do botão enviar ou page load da pagina,   Fico no aguardo e desde já agradeço
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Opa, tudo bem ?
Luiz, se o envio do arquivo é cancelado, ele não continua com o objeto File em memória, só pode ser persistido através de Session, não há outra maneira de se fazer isso. Isso que quer fazer não é muito usual, nem mesmo esperado, portanto não muitas soluções para isso. Use Session e resolve seu problema, depois limpe a session.   Abraços   Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

Olá Carlos e vc teria algum exemplo de como eu faria isto com session e como eu limparia a session dpois de resguardada o arquivo pela session principalmente para evitar tal problema que vc está me dizendo que não seria muito usual mas não teria outra forma  
Fico no aguardo e desde já agradeço
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Luiz, blz ? Não tem segredos como colocar na Session.. Já trabalhou com Session ??   FileUpload1.PostedFile.SaveAs(@"c:\teste.jpg"); //Criando a Session do arquivo Session.Add("arquivo", FileUpload1.PostedFile); //Recuperando a Session do PostedFiles HttpPostedFile posted; posted = ((HttpPostedFile)Session["arquivo"]); //Apagando a Session da mem¢ria Session["arquivo"] = null; Abraços, Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

Neste caso que vc explicou abaixo o Session = null ele desapareceria assim que fosse acionado o evento na minha class na mesma página, mas teria que sêr colocado após a execução dos outros métodos que consomem as variaveis de sessão correto?   Fico no aguardo e desde já agradeço
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Oi Luiz, sim claro, deve ser colocado depois da utilização da session, caso contrário você tentará acessar a session e ela não existirá..   Abraços   Carlos Jr
GOSTEI 0
Luiz Franco

Luiz Franco

20/02/2009

Olá Carlos, voltando ao assunto de numero maximo de bytes para o arquivo uploadado por codigo qdo o arquivo não ultrapassa 133 mb mas é maior que 4 mb ele mostra a msg de erro personalizada que ultrapassou o limite de mb para o usuário inserir arquivo com menor numero de bytes, mas qdo o mesmo ultrapassa ou é igual á 133 mb simplesmente ele mostra pagina não exibida, corrigi em partes isto acrescentando ao web.config as tags abaixo   <!-- Equivalente a 1 Gb -->       <httpRuntime           maxRequestLength="1048576"            executionTimeout="600" />     </system.web>   só que eu gostaria de saber qual o tempo de timeout se equivale a 600 ou menor que este teria como me passar uma table fico no aguardo e desde já agradeço
GOSTEI 0
[devmedia .net]

[devmedia .net]

20/02/2009

Luiz, por favor abra outro chamado , pois este já foi concluído para esse e o outro assunto que você postou. Quanto a sua dúvida, não entendi muito bem o que quis dizer, no outro chamado tente ser mais claro por favor.   No aguardo,   Abraços   Carlos Jr
GOSTEI 0
POSTAR