在 php 上传之前使用 FileReader 调整多个图像的大小

马可

我在 php 中有一个很好的多上传脚本(还有一点 javascript)。问题是,用户直接从相机拍照,所以图像尺寸大,移动带宽小。

所以我搜索了一个解决方案来调整图像客户端的大小,并找到了一些与 FileReader 和 canvas 相关的帖子。

我的问题是如何使用我的 php 上传脚本上传文件阅读器的“结果”。

这就是我所拥有的:

HTML:

<input id="fileupload" type="file" name="images[]" multiple/>

用于动态添加上传字段和预览上传的 Javascript:

var abc = 0; 
$(document).ready(function() {
$('#add-file-field').click(function() {
 $("#newrow").append("<div class='col-sm-4'><div id='newrow' class='card'><div class='card-body'><input id='fileupload' type='file' name='images[]' multiple/></div></div></div>");
});

$('body').on('change', '#fileupload', function(){
  if (this.files && this.files[0]) {
       abc += 1; 

      var z = abc - 1;
      var x = $(this).parent().find('#previewimg' + z).remove();
      $(this).before("<div id='abcd"+ abc +"' class='card-img-top abcd'><img id='previewimg" + abc + "' src='' style='width:100%; height:100%;'/></div>");

      var reader = new FileReader();
      reader.onload = imageIsLoaded;
      reader.readAsDataURL(this.files[0]);

      $(this).hide();

      $("#abcd"+ abc).append($("<img/>", {id: 'delete', src: 'x.png', alt: 'delete'}).click(function() {
      $(this).parent().parent().parent().remove();
      }));
  }
});
//To preview image     
function imageIsLoaded(e) {
      $('#previewimg' + abc).attr('src', e.target.result);
  };
  $('#upload').click(function(e) {
  var name = $(":file").val();
  if (!name)
  {
      alert("First Image Must Be Selected");
      e.preventDefault();
  }
  });
});   

和 PHP 脚本:

$lastpositionid = $_SESSION['lastpositionid'];
$query = "INSERT INTO media (posid,orderid,name,image,created,tag,type) VALUES('$lastpositionid',$position->order_id,?,?,'$date','Vorher',?)";
$stmt = $con->prepare($query);

if(isset($_FILES['images'])){

        $countfiles = count($_FILES['images']['name']);
        $target_directory = "../uploads/". $position->order_id;

        $file_upload_error_messages="";

        for($i=0;$i<$countfiles;$i++){

            if(!is_dir($target_directory)){
               mkdir($target_directory, 0777, true);
            }

            $filename = $_FILES['images']['name'][$i];
            $shafilename = sha1_file($_FILES['images']['tmp_name'][$i]) . "-" . date('d-m-Y-H-i-s') . "-" . basename($_FILES["images"]["name"][$i]);

            $media->image = $filename[$i];
            $file_size = $_FILES['images']['size'][$i];
            $ext = end((explode(".", $filename)));
            $valid_ext = array('jpg','JPG','jpeg','JPEG','png','PNG','gif','GIF','mov','MOV','mp4','MP4');


        if(!empty($_FILES["images"]["tmp_name"][$i])){

            if($file_size > 104857600){
                $file_upload_error_messages.= "<div class=\"alert alert-danger alert-dismissable\">";
                $file_upload_error_messages.= "</div>";
            }   

            if(in_array($ext, $valid_ext)){
               }

               else{
                    $file_upload_error_messages.= "<div class=\"alert alert-danger alert-dismissable\">";
                    $file_upload_error_messages.= "</div>";
               }

            if(!empty($file_upload_error_messages)){
                $file_upload_error_messages.= "<div class=\"alert alert-danger alert-dismissable\">";
                $file_upload_error_messages.= "</div>";
            }       

            if(empty($file_upload_error_messages)){
                    if(move_uploaded_file($_FILES['images']['tmp_name'][$i],$target_directory."/".$shafilename)){
                        echo "<div class=\"alert alert-success alert-dismissable\">";
                        echo "<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>";
                        echo "</div>";

                             // Execute query
                             $stmt->execute(array($shafilename,'uploads/'.$position->order_id.'/'.$shafilename,$ext));

                }
            }
        } 
    }
    print_r($file_upload_error_messages);
}

现在我想我可以使用这个脚本(或我在这里找到的类似脚本):

function handleFiles()
{
    var filesToUpload = document.getElementById('fileupload').files;
    var file = filesToUpload[0];

    // Create an image
    var img = document.createElement("img");
    // Create a file reader
    var reader = new FileReader();
    // Set the image once loaded into file reader
    reader.onload = function(e)
    {
        img.src = e.target.result;

        var canvas = document.createElement("canvas");
        //var canvas = $("<canvas>", {"id":"testing"})[0];
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0);

        var MAX_WIDTH = 400;
        var MAX_HEIGHT = 300;
        var width = img.width;
        var height = img.height;

        if (width > height) {
          if (width > MAX_WIDTH) {
            height *= MAX_WIDTH / width;
            width = MAX_WIDTH;
          }
        } else {
          if (height > MAX_HEIGHT) {
            width *= MAX_HEIGHT / height;
            height = MAX_HEIGHT;
          }
        }
        canvas.width = width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0, width, height);

        var dataurl = canvas.toDataURL("image/png");
        document.getElementById('image').src = dataurl;     
    }
    // Load files into file reader
    reader.readAsDataURL(file);
}

FileReader 的脚本对我来说很清楚,除了如何用 php 再次上传它的部分。顺便说一句,我对 php 比 js 更熟悉,另一个问题是如何将此功能集成到我现有的脚本中...

我没有外部上传脚本,它都在同一个 php 文件中。

谢谢。

有一次我和一只熊搏斗过。

您不能在客户端缩小图像并将其作为文件上传,但您可以缩小图像,然后获取缩小图像的 dataURI 并将其作为字符串上传,然后将其转换回图像服务器端。

var maxWidth = 100;
var maxHeight = 100;

document.getElementById("myfile").onchange = function() {
  var reader = new FileReader();
  reader.onload = function(e) {
    var img = new Image();
    img.onload = function() {
      var cnvs = document.createElement('canvas');
      var rectRatio = img.width / img.height;
      var boundsRatio = maxWidth / maxHeight;
      var w, h;
      if (rectRatio > boundsRatio) {
        w = maxWidth;
        h = img.height * (maxWidth / img.width);
      } else {
        w = img.width * (maxHeight / img.height);
        h = maxHeight;
      }
      cnvs.width = w;
      cnvs.height = h;
      var ctx = cnvs.getContext('2d');
      ctx.drawImage(img, 0, 0, w, h);
      var uri = cnvs.toDataURL();
      // Do something here to upload the smaller verion of the datauri
      // for now i'm just putting it on the page though
      document.body.innerHTML = '<img src="' + uri + '">';
    };
    img.src = e.target.result;
  };
  reader.readAsDataURL(this.files[0]);
}
<input type=file id=myfile accept=".png">

然后在 PHP 端,您可以将其保存为这样的实际图像

$data = $_POST['mydatauri'];
$encodedData = str_replace(' ','+',substr($data,strpos($data,",")+1));
$decodedData = base64_decode($encodedData);
file_put_contents("myUploadImage.png", $decodedData);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试在Codeigniter PHP中上传多个调整大小的图像

来自分类Dev

在上传之前,PHP GD调整大小/裁剪图像

来自分类Dev

使用 Laravel 上传多个调整大小的图像

来自分类Dev

在PHP中上传时调整图像大小

来自分类Dev

简单的PHP多个上传调整大小

来自分类Dev

使用PHP直接从URL调整图像大小

来自分类Dev

如何使用PHP批量调整图像大小

来自分类Dev

如何使用PHP批量调整图像大小

来自分类Dev

如何使用PHP从URL调整图像大小?

来自分类Dev

使用PHP或CSS调整图像大小?

来自分类Dev

PHP 使用纵横比调整图像大小

来自分类Dev

PHP调整图像大小并上传到s3

来自分类Dev

通过JS发送时,PHP图像上传未调整大小

来自分类Dev

PHP调整图像大小并上传到s3

来自分类Dev

如何使用FileReader API从url上传图像文件?

来自分类Dev

Slider FileReader JS多个图像上传(递增索引)

来自分类Dev

使用FileReader选择并显示图像

来自分类Dev

在PHP中使用GD调整图像大小以上传到S3

来自分类Dev

使用PHP SDK在Amazon S3上上传已调整大小的图像

来自分类Dev

在PHP中使用readfile()在下载和演示之前调整图像大小

来自分类Dev

使用BulletProof上传类时,在上传之前调整图像大小

来自分类Dev

如何使用Gd库调整图像大小?的PHP

来自分类Dev

使用PHP重新调整目录中所有图像的大小?

来自分类Dev

使用php和gd调整图像大小并显示

来自分类Dev

如何使用Gd库调整图像大小?的PHP

来自分类Dev

使用PHP重新调整目录中所有图像的大小?

来自分类Dev

使用 php 调整大小或裁剪 base64 图像

来自分类Dev

调整大小,上传图片的PHP

来自分类Dev

使用 PHP 和 jQuery 上传多个图像

Related 相关文章

热门标签

归档