Javascript 上传前在客户端调整图像大小

Javascript 上传前在客户端调整图像大小,javascript,php,jquery,html,Javascript,Php,Jquery,Html,是否有客户端脚本可以自动调整用户上传到输入文件中的图像大小,并用在相同输入中调整大小的新图像自动替换旧图像..我想这样做,以便在..之后将此图像发送到我的php模型。。提前感谢你的帮助 <!DOCTYPE HTML> <html> <head> <title>Untitled</title> </head> <body> <form action="model.php" meth

是否有客户端脚本可以自动调整用户上传到输入文件中的图像大小,并用在相同输入中调整大小的新图像自动替换旧图像..我想这样做,以便在..之后将此图像发送到我的php模型。。提前感谢你的帮助

 <!DOCTYPE HTML>
 <html>
 <head>
     <title>Untitled</title>
 </head>
 <body>
    <form action="model.php" method="post" enctype="multipart/form-data">
       <input type="file" name="image"/>
       <input type="submit" name="do" value="submit"/>
    </form>
 </body>
 </html>

<?php
$target_dir = "folder/";
$filename    = $_FILES["image"]["name"];
$basename    = basename($_FILES["image"]["name"]);
$target_file = $target_dir .$basename;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
$tmp         = $_FILES["image"]["tmp_name"];
if(move_uploaded_file($tmp,$target_file))
{
    echo'done!';
}
?>

您可以通过FileReader API将图像绘制到调整大小的画布上,然后使用canvas.toDataURL'image/png'获取要发送到服务器的base64图像

以下是将图像大小调整为320x240的简化示例:

document.getElementById'example'.addEventListener'change',function e{ var canvas=document.createElement'canvas' var canvasContext=canvas.getContext'2d' canvas.setAttributestyle,“不透明度:0;位置:绝对;z索引:-1;顶部:-100000000;左侧:-100000000;宽度:320px;高度:240px;” document.body.appendChildcanvas; var img=新图像; img.onload=函数{ canvasContext.drawImageimg,0,0,320,240; var base64Image=canvas.toDataURL'image/png' console.logbase64Image //发送到服务器 //SendImageBase64图像 document.body.removeChildcanvas URL.revokeObjectURLimg.src } img.src=URL.createObjectURLe.target.files[0]; } 函数sendImage{ var data=canvas.toDataURL'image/png'; var ajax=null; if window.XMLHttpRequest{ ajax=新的XMLHttpRequest; }如果window.ActiveXObject{ ajax=新的ActiveXObjectMicrosoft.XMLHTTP; } ajax.open'POST','https://example/route",对,; setRequestHeader'Content-Type','application/octet-stream'; ajax.onreadystatechange=函数{ 如果ajax.readyState==XMLHttpRequest.DONE{ 如果ajax.status==200{ //成功 }否则{ //失败 } } }; ajax.senddata; }
这就是我解决问题的方法

//用于以循环方式创建新的文件列表 函数FileListItema{ a=[].slice.callArray.isArraya?a:参数 对于变量c,b=c=a.length,d=!0;b-&&d;d=a[b]文件实例 如果!d向FileList抛出新的TypeErrorexpected参数是File或File对象数组 对于b=new ClipboardEvent.clipboardData | | new DataTransfer;c-;b.items.adda[c] 返回b文件 } fileInput.onchange=异步函数更改{ 常数maxWidth=320 常量最大高度=240 常量结果=[] 对于此.files的const文件{ const canvas=document.createElement'canvas' const ctx=canvas.getContext'2d' const img=wait file.image //本机交互方式不考虑exif旋转 // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/createImageBitmap //const img=wait createImageBitmapfile //计算新尺寸 常数比=Math.minmaxWidth/img.width、maxHeight/img.height 常数宽度=img.宽度*比率+0.5 | 0 常数高度=惯性高度*比率+0.5 | 0 //将画布调整为新尺寸 canvas.width=宽度 canvas.height=高度 //缩放并在画布上绘制图像 ctx.drawImageimg,0,0,宽度,高度 //只是预览一下 document.body.appendChildcanvas //获取二进制数据块 const blob=wait new Promisers=>canvas.toblobs,1 const resizedFile=新文件[blob],File.name,File result.pushresizedFile } const fileList=new FileListItemresult //临时删除事件侦听器,因为 //将新文件列表分配给输入 //将触发新的更改事件。。。 fileInput.onchange=null fileInput.files=文件列表 fileInput.onchange=change }
为什么不在服务器中调整它的大小?如果用户没有调整图像大小并发送一个大的图像会怎么样?另外,您没有检查文件类型。。。这很危险,真的很危险。任何人都可以上传一个PHP文件并在你的服务器上执行。更实际的是,它应该发生在服务器端,否则,可以使用。正如我所知,无法从JavaScript.Mehdi Bounya与客户机的操作系统文件系统交互-这是一个基本代码,而不是完整的代码..兄弟仔细阅读了我的问题。。ه我想,当用户上传图像时,客户端的脚本会自动调整图像大小,并用自动调整大小的新图像替换旧图像。我已经阅读了您的问题,如果用户决定不调整图像大小并发送其全尺寸,该怎么办?我是这么说的。。例如,用户可以上传一幅输入中有2000万像素的图像。因此,我需要一个脚本客户端可以自动调整此图像的大小…调整图像大小的脚本不是用户您是否了解我brotherIt可以工作,但您将裁剪图像而不是调整其大小。谢谢您的精彩回答,如何对多个值执行此操作?更新了我的示例,使其可以使用和不使用多个属性