Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Criamix

Compactar IMAGENS antes do upload

Recommended Posts

Pessoal, desenvolvi um portal para anúncio de veículos voltado ao público do sul de Minas Gerais, mas estou precisando de ajuda para encontrar uma solução. Acontece que acabei descobrindo que nesta região o acesso à internet banda larga ainda é muito restrito, e a grande maioria das pessoas ainda usa linha discada. Então surgiu uma questão: os clientes do portal estão deixando de cadastrar as fotos de seus veículos (são 4 fotos por anúncio) pois o upload das imagens fica muito lento. Nos meus sistemas, geralmente uso Dundas para o upload e ASP.Jpeg para compactar as imagens para um tamanho menor (geralmente 600 px de largura), mas a compactação acontece apenas após o upload do arquivo original no servidor.

 

Ou seja, subir quatro fotos com mais de 800 kb cada uma em linha discada é um tormento para os clientes. Imaginem logistas tendo que anunciar 20 carros com 4 fotos cada um nesta situação! O que eu queria era fazer a compactação da imagem antes do upload. Alguém saberia me ajudar?

 

Agradeço a todos desde já. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

SE for possível seria apenas com JavaScript. Dê uma pesquisada no fórum de JS aqui do iMasters.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Pessoal, em ASP não é possível executar esta operação? Alguém tem alguma idéia?
ASP só roda do lado do servidor, não é possível qualquer intervenção do lado do cliente via ASP. Por isso que eu disse acima que SE isso for possível seria com JavaScript.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de enviar creio que não seja possível através de ASP.

 

É possível usando ActiveX, mas não é Cross-Browser, como este exemplo:

 

<html>
 <head>
 <script language="JavaScript">
 function checkFileSize()
 {
   var axo = new ActiveXObject("Scripting.FileSystemObject");
   var fileToCheck = document.getElementById("testfile").value;
   var FileSize = axo.getFile(fileToCheck).size;
   alert(FileSize + " bytes");
 }
 </script>
 </head>
 <body>
 <form name="test">
 <input type="file" name="testfile">
 <input type="button"value="SIZE" onClick="checkFileSize();">
 </form>
 </body>
 </html>

 

Usando ASP.Net é possível, editando o Application_BeginRequest no global.asax.

 

void Application_BeginRequest(object sender, EventArgs e){
HttpApplication app = sender as HttpApplication;
HttpContext context = app.Context;
HttpWorkerRequest workerRequest = ((IServiceProvider)context).GetService(typeof(HttpWorkerRequest)) as HttpWorkerRequest;

if (context.Request.ContentType.IndexOf("multipart/form-data") == -1){
return;
}

if (workerRequest.HasEntityBody()){
int length = int.Parse(workerRequest.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLen
gth));
if (length > 1000000000){ // if the legth is too large
context.Response.Redirect("mostra página com erro personalizado");
return;
}
}

 

Você tb pode restringir através de JS um tamanho em Width e Height para as imagens, para os clientes não enviarem imagens gigantes, acima de 1000px.

 

Para isso, você pode retornar na mesma hora através de JS, antes de enviar.

OBS: é preciso que o caminho completo da imagem esteja no JS, para ele poder fazer a leitura local:

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
function getImgSize(imgSrc, flag){
if(!flag){
var newImg = new Image();
imgSrc="file://localhost/"+imgSrc;
newImg.src =imgSrc;
}
else
var newImg = imgSrc
if (typeof newImg.complete=='boolean'&&(newImg.complete&&newImg.height*1>0)){
var height = newImg.height;
var width = newImg.width;
alert ('The image size is '+width+'*'+height);
}
else if (typeof newImg.complete=='boolean'){
alert('having trouble')
setTimeout(function(){getImgSize(newImg,'x')}, 3000);
}
else alert('Image cannot be evaluated for size');
}
</script>
</head>
<body>
<input type="file" onchange="getImgSize(this.value)">
</body>
</html>

 

Do contrário, não conheço nenhuma forma de usar ASP convencional para fazer isso, a não ser que no seu componente, você faça uma limitação para kbts, mas mesmo assim, a imagem terá que passar pelo servidor para fazer a leitura.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.