Fórum Como corrigir Class com metodo Upload #3001
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
Posts
20/02/2009
[devmedia .net]
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
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
20/02/2009
[devmedia .net]
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
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
21/02/2009
[devmedia .net]
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
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)
21/02/2009
[devmedia .net]
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
É 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
22/02/2009
[devmedia .net]
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
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
23/02/2009
[devmedia .net]
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
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
24/02/2009
[devmedia .net]
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
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
25/02/2009
[devmedia .net]
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