我通过 jquery ajax 传递一个 base64 url​​ 并希望保存到服务器上。但下面的代码给了我一个空文件。我尝试编写解码后的字符串并从字符串创建图像,但是对于这两个变量,已写入 0 字节。当我测试正在处理的值时,它输出 [object FileReader]......我想我要么错过了一个步骤,要么在某个地方犯了错误。

还有没有办法将图像转换为 $_FILE 类型对象?原因是如果可能的话,我喜欢使用 WordPress 功能来保存文件。

PHP 代码:

function uploadimg() { 
 
$error = false; 
//if ( ! function_exists( 'wp_handle_upload' ) ) require_once( ABSPATH . 'wp-admin/includes/file.php' ); 
//$upload_overrides = array( 'test_form' => false ); 
$images=array(); 
 
$a=0; 
unset ($_POST['action']); 
 
foreach($_POST as $basefile){ 
 
 
    $upload_dir       = wp_upload_dir(); 
    $upload_path      = str_replace( '/', DIRECTORY_SEPARATOR, $upload_dir['path'] ) . DIRECTORY_SEPARATOR; 
    $base64_string = $basefile;  
    echo $basefile; 
    $base64_string = preg_replace( '/data:image\/.*;base64,/', '', $base64_string );  
    $decoded_string= base64_decode($base64_string); // 0 bytes written in fwrite 
    $source = imagecreatefromstring($decoded_string); // 0 bytes written in fwrite 
    $output_file = $upload_path.'myfilef'.$a.'.jpg';  
    $images[]=$output_file; 
    $a++;        
    $image = fopen( $output_file, 'wb' );  
 
    $bytes=fwrite( $image, $source);  
    echo $bytes; 
    fclose( $image );  
} 
 echo json_encode($images); 
 exit; 
 
 } 
 
add_action('wp_ajax_uploadimg', 'uploadimg'); 
add_action('wp_ajax_nopriv_uploadimg', 'uploadimg'); 

jQuery 示例代码

jQuery(document).on('change', '.imageup', function(event){ 
    errors= []; 
    errnum=0; 
    numberofimages=jQuery("#selectedimages > div").length; //get number of images 
 
    if(numberofimages<10){ 
 
        var id= jQuery(this).attr('id'); 
        var length= this.files.length; 
 
        if(length>1) {// if a multiple file upload 
 
        var images = new FormData(); 
        images.append('action', 'uploadimg'); //wordpress specific 
 
            jQuery.each(event.target.files, function(key, value ){ 
 
 
                var size= value.size; 
 
                var extension= value.name.substring(value.name.lastIndexOf('.') + 1).toLowerCase(); 
                var allowedExtensions = ['png', 'jpg', 'jpeg', 'gif']; 
                if( allowedExtensions.indexOf(extension) !== -1 ) { 
 
                if(numberofimages<10){ 
 
                var file=value; 
                console.log(file); 
                var fileReader = new FileReader(); 
 
 
                    fileReader.onload = function (e) { 
                        var img = new Image(); 
 
 
                        img.onload = function () { 
                            var MAX_WIDTH = 100; 
                            var MAX_HEIGHT = 100; 
                            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; 
                    } 
        } 
 
        var canvas = document.createElement("canvas"); 
        canvas.width = width; 
        canvas.height = height; 
        canvas.getContext("2d").drawImage(this, 0, 0, width, height); 
 
        this.src = canvas.toDataURL('image/png'); 
 
    } // end on load function 
 
    img.src = e.target.result; 
 
} //end filereader function 
 
fileReader.readAsDataURL(file); 
console.log(fileReader); 
 
                    images.append(key, fileReader); 
                        numberofimages++; 
 
 
                } else { 
                        errnum++; 
                        errors[errnum]= value=' is a illegal file type'; 
                    } 
                }            
 
 
            }); 
 
        //image holder finished, remove 
        jQuery('#'+id).remove(); 
 
 
        jQuery.ajax({ 
            url: '/wp-admin/admin-ajax.php', 
            type: 'POST', 
            data: images,  
            cache: false, 
            processData: false,  
            contentType: false,  
                success: function(data) { 
                    console.log(data); 
            }//end of success function 
        }); 

请您参考如下方法:

好的,感谢 PaulS 为我指明了正确的方向......下面更新了 jQuery......php 顶部无法使用此功能(我删除了 ajax,即使我已经添加了注释)下面显示了它的去向)数组与我在文件名和 base64 url​​ 中添加的不同。

jsfiddle http://jsfiddle.net/dheffernan/6Ut59/

基本上流程是, 1.检查允许的最大文件数 2 然后对于每个文件检查它不超过它。
3 调用filereader,加载时调用resizeBase64img(感谢提交者) 4.如果在最后一个要处理的文件上——通过Ajax提交FormData 5.当文件返回输入div以显示图像时&如果已满则删除文件输入

function resizeBase64Img(base64, width, height) { 
var canvas = document.createElement("canvas"); 
canvas.width = width; 
canvas.height = height; 
var context = canvas.getContext("2d"); 
var deferred = $.Deferred(); 
$("<img/>").attr("src", base64).load(function() { 
    context.scale(width/this.width,  height/this.height); 
    context.drawImage(this, 0, 0);  
    deferred.resolve($("<img/>").attr("src", canvas.toDataURL('image/jpg')));                
}); 
return deferred.promise();     
} 
 
 
 
function readFile(file) { 
var reader = new FileReader(); 
var deferred = $.Deferred(); 
 
reader.onload = function(event) { 
    deferred.resolve(event.target.result); 
}; 
 
reader.onerror = function() { 
    deferred.reject(this); 
}; 
 
if (/^image/.test(file.type)) { 
    reader.readAsDataURL(file); 
} else { 
    reader.readAsText(file); 
} 
 
return deferred.promise(); 
} 
 
jQuery(document).on('change', '.imageup', function(event){ 
var maximages=4; 
var imagecount=jQuery("#imagesholder > div").length; 
var length= this.files.length; 
var images= new FormData; 
var processKey=0; 
var i=1; 
jQuery.each(event.target.files, function(key, value){ 
    // number of images control.  
    imagecount++; 
    if(imagecount > maximages) { 
        var full=true; 
        jQuery('.imageup').remove(); 
        jQuery('#imageinput').html("Image Quota Full, Please delete some images if you wish to change them"); 
        return;    
    } else if (imagecount == maximages) { 
        var full=true; 
        jQuery('.imageup').remove(); 
        jQuery('#imageinput').html('<div class="image-box-full">Image Quota Full: delete images to change them</div>');    
    } 
 
    //call resize functions 
    var name=value; 
    $.when( readFile(value) ).done(function(value) { 
 
        resizeBase64Img(value, 300, 200).done(function(newImg){ 
             images[processKey]=[]; 
             images[processKey]['url']=newImg[0].src; 
             images[processKey]['name']=name.name; 
             processKey++; 
 
 if(length===processKey) { 
 //----------------INSERT AJAX TO RUN HERE SUBMITTING IMAGES (THE FORMDATA) E.G 
 jQuery.ajax({ 
            url: '/wp-admin/admin-ajax.php', 
            type: 'POST', 
            data: images,  
            cache: false, 
            processData: false,  
            contentType: false,  
                success: function(data) { 
                    console.log(data); 
                    } 
        }); 
 } 
 
 $('#imagesholder').append('<div id="delete'+i+'">'+'<div class="image-box"><div class="box-image"><img src="'+newImg[0].src+'" style="width:50px;"/></div><div class="image-box-text">'+name.name+'</div><input type="image" src="http://testserverdavideec.mx.nf/wp-content/uploads/2014/04/success_close.png" class="deletebutton"  id="delete/i'+i+'"/></div>  </div>'); 
 
i++; 
 
            if(full === true) { 
             jQuery('.image-box-full').show();    
            } 
        }); 
 
    });//end when 
 
 });//end each 
 
 jQuery(this).val('');    
 });//end on change 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!