PHP - 获取 base64 图像字符串解码并另存为 jpg(结果为空图像)

标签 php image codeigniter save base64

您好,我实际上是通过 ajax 将 base64 图像字符串发送到 php 脚本,该脚本只解码字符串并将内容保存为 .jpg 文件。

但结果是一个空图像。

这怎么可能?

PHP脚本:

$uploadedPhotos = array('photo_1','photo_2','photo_3','photo_4');
            foreach ($uploadedPhotos as $file) {
                if($this->input->post('photo_1')){
                     $photoTemp = base64_decode($this->input->post('photo_1'));


                    /*Set name of the photo for show in the form*/
                    $this->session->set_userdata('upload_'.$file,'ant');
                    /*set time of the upload*/
                    if(!$this->session->userdata('uploading_on_datetime')){
                     $this->session->set_userdata('uploading_on_datetime',time());
                    }
                     $datetime_upload = $this->session->userdata('uploading_on_datetime',true);
                    /*create temp dir with time and user id*/
                    $new_dir = 'temp/user_'.$this->session->userdata('user_id',true).'_on_'.$datetime_upload.'/';
                    @mkdir($new_dir);
                    /*move uploaded file with new name*/
                    @file_put_contents( $new_dir.$file.'.jpg',$photoTemp);


            }

对于 ajax 没问题,因为 echo $photoTemp 返回字符串。

我尝试了 var_dump(@file_put_contents( $new_dir.$file.'.jpg',$photoTemp)); 它返回了 bool(true) 因为图像已保存,但图像中没有内容 :( 空图像

for empty image i mean , file is created and named, and it has the same size of the content i pass to php, but when i try to open that image to preview it says, file can't be opened because corrupted or bad file type format

无论如何,这是将照片作为 base64 并将其发送到 php 的 JS:

<script type="text/javascript">

var _min_width = 470;
var _min_height = 330;
var _which;
var _fyle_type;
var  io;
var allowed_types = new Array('image/png','image/jpg','image/jpeg');
if (typeof(FileReader) === 'function'){
$('input[type="file"]').on('change', function(e) {
    var _file_name = $(this).val();
    $('.'+_which+'_holder').text(_file_name);
    var file = e.target.files[0];

    if (!in_array(file.type,allowed_types) || file.length === 0){
        notify("You must select a valid image file!",false,false); 
        return;
    }

    if(file.size > 3145728 /*3MB*/){
        notify("<?php echo lang('each-photo-1MB'); ?>",false,false); 
        return;
    }
    notify_destroy();

    var reader = new FileReader();
    reader.onload = fileOnload;
  reader.readAsDataURL(file);


});

function fileOnload(e) {
    var img = document.createElement('img');
    img.src = e.target.result;

    img.addEventListener('load', function() {
        if(img.width < _min_width || img.height < _min_height ){
        notify("<?php echo lang('each-photo-1MB'); ?>",false,false); 
        return;
        }


        $.ajax({
            type:'post',
            dataType:'script',
            data:{photo_1:e.target.result},
            url:_config_base_url+'/upload/upload_photos',
            progress:function(e){
                console.log(e);
            },
            success:function(d){
                $('body').append('<img src="'+d+'"/>');
            }
         });


    });

}
}
</script>

最佳答案

据我所知,您必须使用图像函数 imagecreatefromstring、imagejpeg 来创建图像。

$imageData = base64_decode($imageData);
$source = imagecreatefromstring($imageData);
$rotate = imagerotate($source, $angle, 0); // if want to rotate the image
$imageSave = imagejpeg($rotate,$imageName,100);
imagedestroy($source);

希望这会有所帮助。

带有图像数据的 PHP 代码

$imageDataEncoded = base64_encode(file_get_contents('sample.png'));
$imageData = base64_decode($imageDataEncoded);
$source = imagecreatefromstring($imageData);
$angle = 90;
$rotate = imagerotate($source, $angle, 0); // if want to rotate the image
$imageName = "hello1.png";
$imageSave = imagejpeg($rotate,$imageName,100);
imagedestroy($source);

所以以下是您程序的 php 部分.. 注意 带有注释的更改 Change is here

    $uploadedPhotos = array('photo_1','photo_2','photo_3','photo_4');
     foreach ($uploadedPhotos as $file) {
      if($this->input->post($file)){                   
         $imageData = base64_decode($this->input->post($file)); // <-- **Change is here for variable name only**
         $photo = imagecreatefromstring($imageData); // <-- **Change is here**

        /* Set name of the photo for show in the form */
        $this->session->set_userdata('upload_'.$file,'ant');
        /*set time of the upload*/
        if(!$this->session->userdata('uploading_on_datetime')){
         $this->session->set_userdata('uploading_on_datetime',time());
        }
         $datetime_upload = $this->session->userdata('uploading_on_datetime',true);

        /* create temp dir with time and user id */
        $new_dir = 'temp/user_'.$this->session->userdata('user_id',true).'_on_'.$datetime_upload.'/';
        if(!is_dir($new_dir)){
        @mkdir($new_dir);
        }
        /* move uploaded file with new name */
        // @file_put_contents( $new_dir.$file.'.jpg',imagejpeg($photo));
        imagejpeg($photo,$new_dir.$file.'.jpg',100); // <-- **Change is here**

      }
    }

关于PHP - 获取 base64 图像字符串解码并另存为 jpg(结果为空图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17810501/

相关文章:

php - MySQL PHP 从数据库中选择和编辑值

javascript - 如何在每次刷新时用新值增加以前的值

java - 我正在尝试使用 docx4j 将图像添加到新的 word 文档

php - 查询依赖子查询太慢

PHP APC - 为什么加载缓存数组操作码很慢?

php - 如何读取 PHP 数组中的多个日期值,然后将它们相减,返回 int 值

java - 使用 ImageIcon(getClass().getResource() 将图像添加到 eclipse java 项目

php - 使用 PHPMailer 发送电子邮件 - 在正文中嵌入图像

javascript - 是否可以通过 iframe 上传一个文件和多个数据?

php - codeigniter 谷歌分析 + 谷歌图表