I've web app running. And it uses ajax upload. The issue is recently users are uploading too big images. So it's taking a bit more time. Users are plaining about that. So what I was thinking is this, 'If I somehow crop and resize the image via js and then send it to the server via ajax upload then the time will be reduced'. So is there any way to do that? Any idea for it?
I've web app running. And it uses ajax upload. The issue is recently users are uploading too big images. So it's taking a bit more time. Users are plaining about that. So what I was thinking is this, 'If I somehow crop and resize the image via js and then send it to the server via ajax upload then the time will be reduced'. So is there any way to do that? Any idea for it?
Share Improve this question asked Jul 6, 2013 at 8:23 Mazhar AhmedMazhar Ahmed 1,5433 gold badges24 silver badges41 bronze badges 3- 1 Why don't you just put a limit on filesize and dimensions? – elclanrs Commented Jul 6, 2013 at 8:25
- possible duplicate, even if quite old still holds in the point stackoverflow./questions/2434458/… – DRC Commented Jul 6, 2013 at 8:26
- 1 Putting limit will force the user to modify it himself. But it will loose the site subscriptions. – Mazhar Ahmed Commented Jul 6, 2013 at 8:27
1 Answer
Reset to default 15A solution is to use modern ways like FileReader and Canvas (But this works only on the latest modern browsers).
http://caniuse./filereader
http://caniuse./canvas
In this example i show how to let the client resize an image before uploading by setting a max width & height mantaining aspect ratio.
In this example max widthHeight = 64; your final image is c.toDataURL();
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
var h=function(e){
var fr=new FileReader();
fr.onload=function(e){
var img=new Image();
img.onload=function(){
var MAXWidthHeight=64;
var r=MAXWidthHeight/Math.max(this.width,this.height),
w=Math.round(this.width*r),
h=Math.round(this.height*r),
c=document.createElement("canvas");
c.width=w;c.height=h;
c.getContext("2d").drawImage(this,0,0,w,h);
this.src=c.toDataURL();
document.body.appendChild(this);
}
img.src=e.target.result;
}
fr.readAsDataURL(e.target.files[0]);
}
window.onload=function(){
document.getElementById('f').addEventListener('change',h,false);
}
</script>
</head>
<body>
<input type="file" id="f">
</body>
</html>
In the canvas part of the code you can also add a cropping function.
Edit as asked in the ments
c.toDataURL();
is the image base64_string you can store it in a hidden input,append to a new FormData()
or wherever you want.
on the server
$data=explode(',',$base64_string);
$image=base64_decode($data[1]);
write to file
$f=fopen($fileName,"wb");
fwrite($f,$image);
fclose($f);
or
$gd=imagecreatefromstring($image);
you can also store the whole base64 image string in the database and always use that.