• js canvas压缩图片和jQuery ajax上传图片简单demo


    原来用的插件,里面东西太乱了,一会jq,一会原生js,本来原生js就不熟,看起来更难受,而且感觉好多东西都是没用的,而且后端php转存文件一直不是很熟悉,正好一起整理一下。就是很简单的一个demo,如果需要复杂的功能的话需要自己添加。但是原理基本都在这了,不是很熟的时候可以拿来看看直接用。

    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>demo</title>
        <script src="js/jquery-2.1.4.js"></script>
    </head>
    <body>
    <form action="upload2.php" enctype="multipart/form-data" method="post">
        <input type="file" name="pic" id="file" onchange="readFile(this)">
        <br>
        <input type="text" name="test">
        <input type="submit" value="提交">
    </form>
    <img src="" alt="" class="img">
    <script>
        $(function(){
            // $("#file").change(function(e){
            //     console.log(e)
            // })
        })
        function readFile(file){
            var file2 = file.files[0] //读取文件流
            let reader = new FileReader()
            reader.readAsDataURL(file2)
            reader.onload = function(e) {
                let base64 = e.target.result
                let image = new Image() //新建一个img标签(还没嵌入DOM节点)
                image.src = base64
                image.onload = function(){
                    let canvas = document.createElement('canvas'),
                        context = canvas.getContext('2d'),
                        imageWidth = image.width / 2,    //压缩后图片的大小
                        imageHeight = image.height / 2,
                        data = ''
    
                    canvas.width = imageWidth
                    canvas.height = imageHeight
    
                    context.drawImage(image, 0, 0, imageWidth, imageHeight)
                    data = canvas.toDataURL(file2.type)
                    $(".img").attr({'src':data})
                    let fpn = dataURLtoFile(data,'file.jpg')
                    let formData = new FormData()
                    formData.append('pic',fpn);
                    formData.append('test','123')
                    formData.append('name','test upload')
                    $.ajax({
                        url: 'upload2.php',
                        type: 'POST',
                        cache: false,
                        data: formData,
                        dataType:'json',
                        processData: false,
                        contentType: false,
                        success:function(data){
                            console.log(data)
                        }
                    });
                }
            }
        }
        function dataURLtoFile(dataurl, filename = 'file') {
            let arr = dataurl.split(',')
            let mime = arr[0].match(/:(.*?);/)[1]
            let suffix = mime.split('/')[1]
            let bstr = atob(arr[1])
            let n = bstr.length
            let u8arr = new Uint8Array(n)
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n)
            }
            return new File([u8arr], `${filename}.${suffix}`, {
                type: mime
            })
        }
    </script>
    </body>
    </html>

    PHP---注意原生的PHP向前端返回数据的时候是不能用return的,需要用echo,用tp5习惯了,这个事还别扭了老半天

    <?php
    $file = $_FILES;
    $post = $_POST;
    //var_dump($post);
    $path = date('Ym',time());
    //判断文件夹是否存在,使用file_exists这个函数,在使用is_dir来判断是不是目录而不是文件
    if(!file_exists($path) || !is_dir($path)){ //不存在这个文件夹或者这个名字不是文件夹就创建
        $mkdir = mkdir($path,0777,true);
    }
    //创建完文件夹之后再判断这个文件夹能不能写入,使用is_writeable,不能写入的话改变权限
    if(!is_writeable($path)){
        $chmod = chmod($path,0777);
        var_dump($chmod);
    }
    $tmpName = $file['pic']['tmp_name'];
    //如果这个临时文件是空的,那就说明没上传文件,后面的就不用走了
    if(empty($tmpName)){
        echo '没有上传文件';
        return;
    }
    //使用这个函数来判断一下用户上传的文件类型是否符合要求,比如用户上传隐藏类型的运行脚本
    $type = file_type($tmpName);
    
    $oldName = $file['pic']['name'];
    $mime = $file['pic']['type'];
    $error = $file['pic']['error'];
    $size = $file['pic']['size'];
    //获取上传的文件的信息[dirname]目录路径//[basename]文件名//[extension]文件后缀名//[filename]不包含后缀的文件名
    $info = pathinfo($oldName);
    $suffix = $info['extension'];//获取文件后缀
    $newName = 'up_' . time() . '.' . $suffix;
    //判断有没有这个临时文件,就是说是不是要上传文件
    if(!is_uploaded_file($tmpName)){
        return '不是上传的文件';
    }
    //然后在这里可以判断文件的类型、mime值、大小、后缀等信息是否符合规则,符合规则的话就可以将缓存中的文件保存到需要的路径中了
    $result = move_uploaded_file($tmpName,$path . '/' . $newName);
    //tp5 封装修改了return,可以作为ajax的数据直接返回,但是原生的return是只在server端(服务端)运行的,ajax不能获取到
    echo json_encode($post);
    function file_type($filename)
    {
        $file = fopen($filename, "rb");
        $bin = fread($file, 2); //只读2字节
        fclose($file);
        $strInfo = @unpack("C2chars", $bin);
        $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
        $fileType = '';
        switch ($typeCode)
        {
            case 7790:
                $fileType = 'exe';
                break;
            case 7784:
                $fileType = 'midi';
                break;
            case 8297:
                $fileType = 'rar';
                break;
            case 8075:
                $fileType = 'zip';
                break;
            case 255216:
                $fileType = 'jpg';
                break;
            case 7173:
                $fileType = 'gif';
                break;
            case 6677:
                $fileType = 'bmp';
                break;
            case 13780:
                $fileType = 'png';
                break;
            case 6063:
                $fileType = 'php';
                break;
            case 4742:
                $fileType = 'js';
                break;
            default:
                $fileType = 'unknown: '.$typeCode;
        }
        //Fix
        if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg';
        if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png';
        return $fileType;
    }
  • 相关阅读:
    luncence
    git与svn与github与码云的区别
    redis缓存在项目中的使用
    大宗风控体系“药不能停”:一线实战高手解密衍生品交易风险管控的三个层级!
    永恒的风控:大宗商品贸易融资背后的核心风险该如何规避?
    达信:深度解读COSO新版企业风险管理框架(ERM)
    DataOps Reading Notes
    SDN Reading Notes
    给某mooc站点准备的FE大纲
    《财富》杂志推荐的75本商业必读书?
  • 原文地址:https://www.cnblogs.com/dayin1/p/12757879.html
Copyright © 2020-2023  润新知