前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js批量上传文件_批量上传图片java

js批量上传文件_批量上传图片java

作者头像
Java架构师必看
发布2022-06-28 08:22:10
27.4K0
发布2022-06-28 08:22:10
举报
文章被收录于专栏:Java架构师必看

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说js批量上传文件_批量上传图片java,希望能够帮助大家进步!!!

代码语言:txt
复制
    文件上传无疑是web应用中一个非常常用的功能,下面小编给大家分享一下diyUpload.js+ThinkPHP中的UploadFile类实现图片的批量上传。
代码语言:txt
复制
    首先,给大家介绍展示一下具体操作页面:

html代码如下:

代码语言:javascript
复制
<div class="stepsTop">
    <!--进度条-->
    <ul class="steps clearfix" id="steps">
        <li class="active"><span>1</span>上传图片</li>
        <li><span>2</span>上传图片信息文件(可省略)</li>
        <li class="complete"><span>完成</span></li>
    </ul>
    <!--图片上传过程中,图片上传动态提示-->
    <div class="pic_operation clearfix"  style="display:none">
        <div class="lf_cont">
        	<em>已选中<span class="num" id="slNum">'+slNum+'</span>张图片<!--图片上传总数-->
        </div>
        <div class="btns">
            <strong>正在上传第<span class="num" id="nowNum">'+nowNum+'</span>张图片...</strong><a href="javascript:;" class="add " id="prevStep">继续添加</a><a href="javascript:;" class="nextStep" id="nextStep">开始上传</a>
        </div>
    </div>
    <ul class="stepsCont" id="stepsCont">
        <!--选择图片按钮-->
        <li class="cur">
            <div class="upload">
                <p class="pic_con"><img src="/NewWanbu/App/Photo/Tpl/Public/image/i_pic.jpg" alt=""></p>
                <p class="up_btn"><a href="javascript:;" id="slPicBtn">点击选择图片</a></p>
                <p>支持JPG、PNG、GIF格式图片,最多上传50张,图片文件名不能重复</p>
            </div>
        </li>
    </ul>  
</div>

只听到从架构师办公室传来架构君的声音:

渐写到别来,此情深处,红笺为无色。有谁来对上联或下联?

代码语言:txt
复制
    如图,最上方有操作进度条提示当前进度,下方是一个选择图片的按钮,点击按钮选择图片之后效果如下图所示:
代码语言:txt
复制
    如果还想选择其他图片可以点击‘继续添加’按钮,选择想要上传的图片;或者已选中的图片不想要了,可以点击图片上的“X”按钮删除,如下:

页面上js代码如下:

代码语言:javascript
复制
此代码由Java架构师必看网-架构君整理
   /*
    * 服务器地址,成功返回,失败返回参数格式依照jquery.ajax习惯;
    * 其他参数同WebUploader
    */
    $('#slPicBtn').diyUpload({    //插件中的方法名
        url:'/NewWanbu/App/Photo/index.php/Photo/upload',
        success:function( data ) {
            console.info( data );
        },
        error:function( err ) {
            console.info( err );	
        }
    });

	//全部上传结束后触发;
	if($('#stepsCont').children().eq(1)){   //控制进度条的代码
		$('#nextStep').click(function(){
            $('#steps').children().eq(2).addClass('active');
            $('#prevStep').remove();
            $('#stepsCont').children().eq(1).hide();
		})	
	}

    function hasAlreadyFinish(n){
        var nowNum = $('.diySuccess').length;
        var n = 1;
        if(n<=nowNum){
            n++;
        }
        $('#nowNum').text(n);
    }

js插件中代码:

代码语言:javascript
复制
(function( $ ) {
    $.fn.extend({
        /*
        *   上传方法 opt为参数配置;
        *   serverCallBack回调函数 每个文件上传至服务端后,服务端返回参数,无论成功失败都会调用 参数为服务器返回信息;
        */
        diyUpload:function( opt, serverCallBack ) {
            if ( typeof opt != "object" ) {
                alert('参数错误!');
                return; 
            }
            
            var $fileInput = $(this);
            var $fileInputId = $fileInput.attr('id');
            
            //组装参数;
            if( opt.url ) {
                opt.server = opt.url; 
                delete opt.url;
            }
            
            if( opt.success ) {
                var successCallBack = opt.success;
                delete opt.success;
            }
            
            if( opt.error ) {
                var errorCallBack = opt.error;
                delete opt.error;
            }
            
            //迭代出默认配置
            $.each( getOption( '#'+$fileInputId ),function( key, value ){
                    opt[ key ] = opt[ key ] || value; 
            });
            
            if ( opt.buttonText ) {
                opt['pick']['label'] = opt.buttonText;
                delete opt.buttonText;  
            }
            
            var webUploader = getUploader( opt );
            
            if ( !WebUploader.Uploader.support() ) {
                alert( ' 上传组件不支持您的浏览器!');
                return false;
            }
            
            //绑定文件加入队列事件;
            webUploader.on('fileQueued', function( file ) {
                createBox( $fileInput, file ,webUploader);
            
            });
            
            //进度条事件
            webUploader.on('uploadProgress',function( file, percentage  ){
                var $fileBox = $('#fileBox_'+file.id);
                var $diyBar = $fileBox.find('.diyBar'); 
                $diyBar.show();
                percentage = percentage*100;
                showDiyProgress( percentage.toFixed(2), $diyBar);
                
            });
            
            //全部上传结束后触发;
            webUploader.on('uploadFinished', function(){
                $('.diyButton').remove();
                $fileInput.hide();
                $('#stepsCont').children().eq(1).show();
                $('#stepsCont').children().eq(0).hide();
                $('#steps').children().eq(1).addClass('active');
                $('.pic_operation').find('em').html('上传成功');
                $('#prevStep').remove();
                $('#nextStep').text('完成');  
            });

            //绑定发送至服务端返回后触发事件;
            webUploader.on('uploadAccept', function( object ,data ){
                if ( serverCallBack ) serverCallBack( data );
            });
            
            //上传成功后触发事件;
            webUploader.on('uploadSuccess',function( file, response ){
                var $fileBox = $('#fileBox_'+file.id);
                var $diyBar = $fileBox.find('.diyBar'); 
                $fileBox.removeClass('diyUploadHover');
                $diyBar.fadeOut( 1000 ,function(){
                    $fileBox.children('.diySuccess').show();
                });
                if ( successCallBack ) {
                    successCallBack( response );
                }
            });
            
            //上传失败后触发事件;
            webUploader.on('uploadError',function( file, reason ){
                var $fileBox = $('#fileBox_'+file.id);
                var $diyBar = $fileBox.find('.diyBar'); 
                showDiyProgress( 0, $diyBar , '上传失败!' );
                var err = '上传失败! 文件:'+file.name+' 错误码:'+reason;
                if ( errorCallBack ) {
                    errorCallBack( err );
                }
            });
            
            //选择文件错误触发事件;
            webUploader.on('error', function( code ) {
                var text = '';
                switch( code ) {
                    case  'F_DUPLICATE' : text = '该文件已经被选择了!' ;
                    break;
                    case  'Q_EXCEED_NUM_LIMIT' : text = '上传文件数量超过限制!' ;
                    break;
                    case  'F_EXCEED_SIZE' : text = '文件大小超过限制!';
                    break;
                    case  'Q_EXCEED_SIZE_LIMIT' : text = '所有文件总大小超过限制!';
                    break;
                    case 'Q_TYPE_DENIED' : text = '文件格式不支持!';
                    break;
                    default : text = '未知错误!';
                    break;  
                }
                if(text != "该文件已经被选择了!"){
                alert( text );
                }
            });
        }
    });
    
    //Web Uploader默认配置;
    function getOption(objId) {
        /*
        *   配置文件同webUploader一致,这里只给出默认配置.
        *   具体参照:http://fex.baidu.com/webuploader/doc/index.html
        */
        return {
            //按钮容器;
            pick:{
                id:objId,
                label:"点击选择图片"
            },
            //类型限制;
            accept:{
                title:"Images",
                extensions:"gif,jpg,png",
                mimeTypes:"image/*"
            },
            //swf路径
            swf: '/NewWanbu/App/Photo/Tpl/Public/Uploader.swf',
            disableGlobalDnd: true,
            
            //配置生成缩略图的选项
            thumb:{
                width:170,
                height:150,
                // 图片质量,只有type为`image/jpeg`的时候才有效。
                quality:70,
                // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
                allowMagnify:false,
                // 是否允许裁剪。
                crop:true,
                // 为空的话则保留原有图片格式。
                // 否则强制转换成指定的类型。
                type:"image/jpeg"
            },
            //文件上传方式
            method:"POST",
            //服务器地址;
            server:"",
            //是否已二进制的流的方式发送文件,这样整个上传内容php://input都为文件内容
            sendAsBinary:false,
            // 开起分片上传。 thinkphp的上传类测试分片无效,图片丢失;
            chunked:true,
            // 分片大小
            chunkSize:512 * 1024,
            //最大上传的文件数量, 总文件大小,单个文件大小(单位字节);
            fileNumLimit:50,
            fileSizeLimit:50 * 2097152,
            fileSingleSizeLimit: 2097152  //2M
        };
    }
    
    //实例化Web Uploader
    function getUploader( opt ) {
        return new WebUploader.Uploader( opt );;
    }
    
    //操作进度条;
    function showDiyProgress( progress, $diyBar, text ) {
        if ( progress >= 100 ) {
            progress = progress + '%';
            text = text || '上传完成';
        }else{
            progress = progress + '%';
            text = text || progress;
        }
        
        var $diyProgress = $diyBar.find('.diyProgress');
        var $diyProgressText = $diyBar.find('.diyProgressText');
        $diyProgress.width( progress );
        $diyProgressText.text( text );
    }
    
    //取消事件; 
    function removeLi ( $li ,file_id ,webUploader) {
        webUploader.removeFile( file_id );
        if ( $li.siblings('li').length <= 0 ) {
            $li.parents('.parentFileBox').remove();
        } else {
            $li.remove();
        }
        
    }
    
    //创建文件操作div;    
    function createBox( $fileInput, file, webUploader ) {
        var file_id = file.id;
        var $parentFileBox = $fileInput.next('.parentFileBox');
        //添加父系容器;
        if ( $parentFileBox.length <= 0 ) {
            var div = '<div class="parentFileBox"> \
                    <ul class="fileBoxUl"></ul>\
                    </div>';
            $fileInput.after( div );
            $parentFileBox = $fileInput.next('.parentFileBox');
        }
        
        //创建按钮
        if ($('.up_btn').find('.diyButton').length <= 0 ) {
            var div = '<div class="diyButton"> \
                    <a class="diyStart" href="javascript:void(0)">开始上传</a> \
                    <a class="diyCancelAll" style="display:none" href="javascript:void(0)">全部取消</a> \
                    </div>';
            $('.up_btn').append( div );
            var $startButton = $('.up_btn').find('.diyStart');
            var $cancelButton = $('.up_btn').find('.diyCancelAll');
            
            //开始上传,暂停上传,重新上传事件;
            var uploadStart = function (){
                webUploader.upload(); 
                $('.btn').find('strong').show();
            }
                
            //绑定开始上传按钮;
            $startButton.one('click',uploadStart);
        }
            
        //添加子容器;
        var li = '<li id="fileBox_'+file_id+'" class="diyUploadHover"> \
                    <div class="viewThumb"></div> \
                    <div class="diyCancel"></div> \
                    <div class="diySuccess"></div> \
                    <div class="diyFileName">'+file.name+'</div>\
                    <div class="diyBar"> \
                    <div class="diyProgress"></div> \
                    <div class="diyProgressText">0%</div> \
                    </div> \
                </li>';     
        $parentFileBox.children('.fileBoxUl').append( li );
        
        //父容器宽度;
        var $width = $('.fileBoxUl>li').length * 190;
        var $maxWidth = $fileInput.parent().width();
        $width = $maxWidth > $width ? $width : $maxWidth;
        $parentFileBox.width( $width );
        var $fileBox = $parentFileBox.find('#fileBox_'+file_id);

        //绑定取消事件;
        var $diyCancel = $fileBox.children('.diyCancel').one('click',function(){
            removeLi( $(this).parent('li'), file_id, webUploader ); 
        });
        
        if ( file.type.split("/")[0] != 'image' ) {
            var liClassName = getFileTypeClassName( file.name.split(".").pop() );
            $fileBox.addClass(liClassName);
            return; 
        }
        
        //生成预览缩略图;
        webUploader.makeThumb( file, function( error, dataSrc ) {
            if ( !error ) { 
                $fileBox.find('.viewThumb').append('<img src="'+dataSrc+'" >');
            }
            var slNum = $.trim($('.fileBoxUl').children().length);
            $('.diyCancel').click(function(){
                if(slNum>0){
                    slNum--;
                    $('#slNum').html(slNum);
                }   
            })
            $('#slNum').html(slNum);
        }); 
        
        //添加流程操作按钮及上传显示
        $('.pic_operation').show();
        $('#slPicBtn').css({'position':'absolute','top':'178px','right':'156px','opacity': '0','filter':'alpha(opcacity=0)','width':'88px','height':'30px','line-height':'30px'});
        $('#slPicBtn').find('.webuploader-pick').text('继续添加').css({'backgroundColor':'#FFF','border':'1px solid #B4B4B4','color':'#6C6C6C'});
        $('.pic_con').hide();
        $('.pic_con').next().next().hide();
        }
        
    //获取文件类型;
    function getFileTypeClassName ( type ) {
        var fileType = {};
        var suffix = '_diy_bg';
        fileType['jpg'] = 'jpg';
        fileType['jpeg'] = 'jpeg';
        fileType['png'] = 'png';
        fileType['gif'] = 'gif';
        return  fileType+suffix;
    }
})( jQuery );
代码语言:txt
复制
    图片选择完成后点击‘开始上传’按钮上传图片,上传完成后页面展示如下图:
代码语言:txt
复制
    可以修改或者删除图片,也可以点击‘全选图片’按钮,批量删除图片,或者选择多张图片删除:

PHP上传图片代码:

代码语言:javascript
复制
此代码由Java架构师必看网-架构君整理
//上传图片
  public function upload(){
    import("ORG.Net.UploadFile");
    $wallid = $this->$wallid; 
    $path = SITE_PATH."/Uploads/photo/".$wallid.'/img/';//原图片保存目录
    $path_thumb = SITE_PATH."/Uploads/photo/".$wallid.'/thumb/';//缩略图保存目录
    //创建图片保存目录并附权限
    if(!file_exists(SITE_PATH."/Uploads/photo/".$wallid)){
      mkdir(SITE_PATH."/Uploads/photo/".$wallid, 0777);
    }
    if(!file_exists($path)){
       mkdir($path, 0777);
    }
    if(!file_exists($path_thumb)){
       mkdir($path_thumb, 0777);
    }
    
    $upload = new UploadFile();
    $upload->maxSize  = 1024*1024*2;
    $upload->allowExts  = array('jpg', 'gif', 'png', 'jpeg');
    $upload->savePath =  $path;
    $upload->thumb = true;
    $upload->thumbPrefix='m_,s_';
    $upload->thumbPath=$path_thumb;
    $upload->thumbMaxWidth='600,300';
    $upload->thumbMaxHeight='400,200';
    $upload->thumbRemoveOrigin=false;
    
    if(!$upload->upload()) {
      exit(json_encode( array( 'status'=>'0','info'=>$upload->getErrorMsg() ) ));
    }else{
      $info =  $upload->getUploadFileInfo();
    }

    $size = $info['0']['size'];
    $imgname = $info['0']['name'];
    $savename = $info['0']['savename'];
    $extension = $info['0']['extension'];

    if($size > 1024*1024*2){
      exit(json_encode( array( 'status'=>'2','info'=>"文件大小超过限制")));
    }else{
      if($extension=="jpg" || $extension=="JPG" || $extension=="gif" || $extension=="GIF" || $extension=="png" || $extension=="PNG" || $extension=="bmp" || $extension=="BMP"){
        //具体需求操作
      }else{
        exit(json_encode( array( 'status'=>'3','info'=>"上传文件格式错误")));
      }
    }
  }
代码语言:txt
复制
   到此,批量上传图片就全部实现了,但是有一个bug一直困扰了小编很久,就是有些图片原图会成功上传,但缩略图会上传成黑色的图片,如图:
代码语言:txt
复制
   如果聪明的你知道的话,记得分享一下哈。

今天文章到此就结束了,感谢您的阅读,Java架构师必看祝您升职加薪,年年好运。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-262,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档