zoukankan      html  css  js  c++  java
  • js 上传文件功能

    一,文件上传插件webUploader  使用方法请见   http://fex.baidu.com/webuploader/getting-started.html

    这个插件有个坑,困扰我好久才找到解决办法,就是使用webUploader点击浏览没有反应,一定要按F12才能点击  请参照此文:https://blog.csdn.net/rock154/article/details/80289696

    webuploader插件如果你要自己获取到浏览的文件上传给后台的话,可以使getFiles()方法来获取

    上传文件到后台:参照此文 :https://www.cnblogs.com/labnizejuly/p/5588444.html     https://www.cnblogs.com/007sx/p/7520529.html

    webuploader  使用upload()方法上传文件如何传自已的参数值给后台           https://blog.csdn.net/tuchui88/article/details/77856968

                                       https://blog.csdn.net/w592376568/article/details/78733511

    //上传文件之前,添加要给后台传的参数
    uploader.off('uploadBeforeSend').on('uploadBeforeSend', function (object, data, header) {
         data.json = JSON.stringify({bjNo: bjNo, delFileId: delFileId.join(',')});
    });

     webuploader 的 fileNumLimit  定义了,不能再动态更改了,看了一下源码,是通过 beforeFileQueued 事件控制,如果想实现动态改变话,自己可以重写此方法,如下:

              //图片上传识别后,再次点入弹窗删除已上传的图片,再点取消还原图片,因为图片已从uploader对象中删除了,会导致可以多上传删除又取消的文件个数
                    var flag=true;
                    var max=9;
                    //重写beforeFileQueued  处理文件数量控制
                    uploader.off('beforeFileQueued').on( 'beforeFileQueued', function( file ) {
                        var count=$('.fileBoxUl li').length;//当前图片个数
                        if ( count >= max && flag ) {
                            flag = false;
                            this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
                            setTimeout(function() {//setTimeout添加异步,会等待主线程全部执行完成,才来执行此处,这样有多个文件是多余的,也只会弹一次错误框
                                flag = true;
                            }, 0);
                        }
                        return count >= max ? false : true;
                    });

    二,html 文件上传控件,生成缩略图展示,并上传给后台

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <!-- <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> -->
        <script src="../jquery-3.2.1.js"></script>
        <script type="text/javascript">
            $(function () {
                $("#file0").change(function () {
                    $('#imgDiv').empty();
                    for(var i=0;i<this.files.length;i++){
                         var objUrl = getObjectURL(this.files[i]);
                        if (objUrl) {
                            $('#imgDiv').append('<img src="'+objUrl+'" height="70" id="img0">');
                        }
                    }           
                });
                //还没有上传到服务器之前要显示图处缩略图,获取url
                function getObjectURL(file) {
                    var url = null ; 
                    if(file){
                        if (window.createObjectURL!=undefined) { // basic
                            url = window.createObjectURL(file) ;
                        } else if (window.URL!=undefined) { // mozilla(firefox)
                            url = window.URL.createObjectURL(file) ;
                        } else if (window.webkitURL!=undefined) { // webkit or chrome
                            url = window.webkitURL.createObjectURL(file) ;
                        }
                    }
                    return url;
                }
                $('#btnUpload').click(function(){
                    console.log($("#file0")[0].files);
                    var formData = new FormData();
                    formData.append('file', $("#file0")[0].files);
                    $.ajax({
                        url: 'http://common1.trafree.com:33050/bj/manager/manual/importFile',
                        type: 'POST',
                        cache: false,
                        data: formData,
                        processData: false,
                        contentType: false
                      }).done(function(res) {
                         console.log("success");
                      })
                    .fail(function(res) {
                         console.log("fail");
                    });                 
                     });        
             });
        </script>
    </head>
    <body>
        <input type="file" name="file0" id="file0" multiple="multiple">
        <div id="imgDiv"><img src="" height="70" id="img0"></div>
        <input type="button" id="btnUpload" value="上传">
    </body>
    </html>

     要把以上的上传文件功能设计得漂亮点,参照此文 :https://www.cnblogs.com/kongxianghai/p/5624785.html

    三,上传文件控件里的文件上传给后台还可使用jquery.form.js的  ajaxSubmit    方法      ajaxSubmit   会将整个form表单传给后台,后台自己去解析表单数据

    以下事例是,当文件上传时传给后,后台将excel里的信息解析出来,返回给前台展示:

    <form id="importExcelForm" enctype="multipart/form-data" style="display:inline;">
          <span class="btn btn-warning fileinput-button">
               <span>导入</span>
          <input type="file" id="uploadExcel" name="uploadExcel" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
          </span>
    </form>
    //乘客信息导入弹窗导入Excel文件改变事件
                .on('change'+eventSpace,'#uploadExcel',function () {
                    $('#importExcelForm').ajaxSubmit({
                        dataType: "json",
                        type:'POST',
                        url:options.config.url.importTravExcel,
                        success: function (res) {
                            if(res.error.code==0) {
                                var data=res.data;
                                $('#importTravDialog [name="adtNum"]').text(data.adtNum);
                                $('#importTravDialog [name="cnnNum"]').text(data.cnnNum);
                                $('#importTravDialog [name="infNum"]').text(data.infNum);
                                $('#importTravDialog [name="stuNum"]').text(data.stuNum);
                                loadTravsTable(data.travs||[]);
                                $('#uploadExcel').val('');//把上传文件控件清空,以便下次再选择同一个文件时也能触发事件
                            }
                        }
                    });
                })

    form 在使用包含文件上传控件的表单时,form需加上enctype="multipart/form-data"

    四,js允许上传多个文件,假如选择了多个上传,又删除了几张,如何实现不把删除的文件传给后台

    参考此文:inputfile多图片上传,删除其中的一张

    以下方法似乎也是OK的:

    file multiple多选无法删除里面已经选中的文件,会一起回发服务器,但是可以通过js记录删除的图片下标,一起回发服务器,然后服务器遍历Files容器保存的时候对比被删除下标,对比成功则不保存这张图片

  • 相关阅读:
    对 HTML 语义化的理解
    cookies,sessionStorage 和 localStorage 的区别
    display:none和visibility:hidden两者的区别
    页面导入样式时,使用link和@import有什么区别
    ES6之let和const
    v-if和v-show 的区别
    解决:Sass Loader has been initialised using an options object that does not ma tch the API schema.
    [转]javaweb学习总结(十四)——JSP原理
    [转]JavaWeb学习总结(十三)——使用Session防止表单重复提交
    [转]JavaWeb学习总结(十二)——Session
  • 原文地址:https://www.cnblogs.com/pfcan66/p/9483073.html
Copyright © 2011-2022 走看看