• 文件上传小技巧/原生态【html篇】


      引语:大家都知道,html中上传文件就一个input,type=file就搞定了。但是,这个标签的样式,实在不值得提点什么,要改动他的样式,恐怕也是较难的。但是其实挺简单,今天就来说说上传文件小技巧吧!
      1. 怎样自定义样式?
        1. 只管按照自己喜欢看到的样式去定义即可,如<a href='javascript:;' class='upload-button'></a>,可以是背景图片效果,可以是文字指示,总之想怎么改怎么改!有了按钮,还需要一个文件名容器,用来存放选择上传文件时的名字,从而不让上传看起来枯涩难懂。2. 添加真正需要上传的文件控件,并设置属性display:none;如 <input type='file' class='hide' />, 这样就有了真正的上传文件的地方了。所以,可以说,上传文件的界面有多漂亮取决你的想象力!
      2. 怎样触发事件?
        这是个重点,触发的点应该是自己写的样式处,而真正起作用的元素却是隐藏的,但是并不影响它的点击效果,只需要给它触发一个点击事件即可,如$('#target-file').trigger('click');
      3. 多选文件?
        多文件上传,只需使用html的一个file的multiple=true即可,当然你也可以选择第三方的上传控件,如swfupload,效果是真心不错的,但是对于不想用的插件的人,就不起作用了。                                                                          
      4.  相关插件? 
        界面美化其实可以使用jqueryui等插件;
        要做一些友好的交互的话,都会用到ajax技术,无刷新切换、异步上传、提交,最后,其实ajax的路径也是可以保留的,使用pushState, replaceState 实现 pjax .
        表单验证:validform.js
        异步提交文件: jquery.form.js
        友好的弹窗提示:layer.js
      5. 一点兼容性的问题?
        做界面方面的工作,最怕的也是很重要的工作,就是各个浏览器之间的兼容性问题,下面主要列几点供参考:
        table宽度的处理方式不一致;
        select, input显示高度不一致;
        alert弹窗不一致;
        ...
     
      6. 演示代码?
    <a href="javascript:;" up-type-id="1" class="btn btn-default small-btn switch-upload-method"><span>本地上传</span></a>
    <a href="javascript:;" up-type-id="2" class="upload-file-instead btn btn-default small-btn switch-upload-method"><span>打包工具</span></a>
    <input type="file" name="apkFiles[]" id="local-upload-real-file" class="upload-file-real hide" response-id="local-upload-container" multiple='true'  />
    <input type="file" name="apkToolFiles[]" id="apk-tool-real-file" class="upload-file-real hide" response-id="apk-tool-container-textarea" />
    <script>
        $(function(){
            var alertTitle = '系统提示:';
            var submitId = '#do-submit';
            $('#taskForm').Validform({
                btnSubmit: submitId,
                tiptype: 1,
                ignoreHidden: true,
                dragonfly: false,
                tipSweep: true,
                label: ".label",
                showAllError: false,
                postonce: true,
                ajaxPost: true,
                datatype:{
                },
                beforeCheck:function(curform){
                },
                beforeSubmit:function(curform){
                    $('.upload-file-real').attr('disabled', 'disabled');
                    $(submitId).attr('disabled', 'disabled');   //提交前禁用按钮
                    ajaxSubmitForm(curform);
                    $(submitId).removeAttr('disabled');         //失败后恢复可提交
                    return false;
                },
                submitForm: function(){}                        //不再起作用
            });
    
            //切换上传方法
            $('.switch-upload-method').off().on('click', function(){
    //            $(submitId).attr('disabled', 'disabled');
                var pObj = $(this).parent().find('.switch-upload-method');
                var index = pObj.index(this);
                var uploadTypeId = $('#upload-type-id').val();                      //上传方式:1:打包工具;2:本地上传,0:没有上传方式
                var uploadType = $(this).attr('up-type-id');
                if(parseInt($('#sub-channel-count').html()) > 0){
                    if(uploadTypeId != uploadType){
                        layer.alert('还有子渠道包数据,不能完成切换,请先确认清除再切换!');
                        return false;
                    }
                }
                pObj.not(':eq(' + index + ')').removeClass('btn-danger').addClass('btn-default');
                pObj.eq(index).removeClass('btn-default').addClass('btn-danger');
                if(uploadType == 36){               //local-upload
                    $('#upload-type-id').val(uploadType);
                    $('#init-apk-container').show();
                    $('#apk-tool-container').hide();
                    $('#upload-main-control').find('.del-it-main').css({display: 'inline-block'});
                    $('#local-upload-real-file').trigger('click');
                }else if(uploadType == 35){         //apk-tool
                    $('#upload-type-id').val(uploadType);
                    $('#init-apk-container').hide();
                    $('#local-upload-container').hide();
                    $('#upload-main-control').find('.del-it-main').hide();
                    $('#apk-tool-container').show();
                }
            });
            //本地上传
            $('#local-upload-real-file').off().on('change', function(){
                if(!$(this).val()){
                    return false;
                }
                file_size = 0;
                filepath = $(this).val();
                maxFileSize = 30 * 1024 * 1024;
                var  browserCfg = {};
                var ua = window.navigator.userAgent;
                if (ua.indexOf("MSIE") >=1 ){
                    browserCfg.ie = true;
                }else if(ua.indexOf("Firefox") >=1 ){
                    browserCfg.firefox = true;
                }else if(ua.indexOf("Chrome") >=1 ){
                    browserCfg.chrome = true;
                }
                if (browserCfg.ie) {
                    var img = new Image();
                    img.src = filepath;
                    file_size = img.fileSize;
                    while (true) {
                        if (img.fileSize > 0) {
                            if (img.fileSize > maxFileSize) {
                                alert("上传包超过30MB限制,请使用打包工具上传!");
                                return false;
                            }
                            break;
                        }
                    }
                } else {
                    file_size = this.files[0].size;
                    if (file_size > maxFileSize) {
                        alert("上传包超过30MB限制,请使用打包工具上传!");
                        return false;
                    }
                }
    
                var responseObjId = $(this).attr('response-id');
                var responseObj = $('#' + responseObjId);
                $('#taskForm').ajaxSubmit({
                    url:'/aa/bb/uploadTmpApk',
                    resetForm: false,
                    dataType:  'json',
                    beforeSubmit:  function(option){
                        window.loading = layer.load(2);
                    },
                    success: function(data, statusText){
                        layer.close(window.loading);
                        if(data.status == 1){
                            $('#version-identifier').val(data.version);
                            responseObj.html(data.apkInfoHtml);
                            responseObj.show();
                            var delObj = $('#upload-main-control').find('.del-it-main');
                            delObj.css({'display': 'inline-block'});
                            $('#sub-channel-count').html(data.apkTotal);
                            $('#init-apk-container').hide();
                            $(submitId).removeAttr('disabled');
                        }else{
                            layer.alert(data.info, {title: alertTitle});
                        }
                    },
                    error: function(data){
                        layer.close(window.loading);
                        layer.alert('未知错误,请稍后再试!');
                    }
                });
                return false;//防止dialog 自动关闭
            });
            //打包工具
            $('#apk-tool-real-file').off().on('change', function(){
                if(!$(this).val()){
                    return false;
                }
                var responseObjId = $(this).attr('response-id');
                var responseObj = $('#' + responseObjId);
                $('#Form').ajaxSubmit({
                    url:'/aa/bb/uploadTmpApkTool',
                    resetForm: false,
                    dataType:  'json',
                    beforeSubmit:  function(option){
                        window.loading = layer.load(2);
                    },
                    success: function(data, statusText){
                        layer.close(window.loading);
                        if(data.status == 1){
                            $('#version-identifier').val(data.version);
                            responseObj.html(data.infoHtml);
                            var parentContainer = responseObj.parent().parent(),
                                nameContainer = parentContainer.find('.apk-name-container'),
                                    delObj = parentContainer.find('.del-it-apk-tool');
                            nameContainer.html(data.apkName);
                            nameContainer.attr('title', data.apkName);
                            $('#apk-tool-file-tmp').html(data.fileInfo);
                            $(submitId).removeAttr('disabled');
                        }else{
                            layer.alert(data.info, {title: alertTitle});
                        }
                    },
                    error: function(data){
                        layer.close(window.loading);
                        layer.alert('未知错误,请稍后再试!');
                    }
                });
                return false;//防止dialog 自动关闭
            });
            $('.apk-tool-upload-button').on('click', function(){
                $('#apk-tool-real-file').trigger('click');
            });
        });
    </script>

      以上,主要就是,使用隐藏的input file标签选择,选择文件之后立即ajax提交,最后,整个表单ajax提交的过程。  

     
      合理使用一些css, js, 让你的网页更自由!
  • 相关阅读:
    Velocity 创建命令缓存
    关于RESTful Web Services和RESTful设计的一些文章
    [转]Restful Web Services浅析
    Silverlight点滴(四)Silverlight访问Web Service报"System.Security.SecurityException: 安全性错误"的处理
    WebDevHelper RESTful服务和Ajax开发时的利器
    [原]读Google Data API源代码一:从创建一个日历(Calendar)开始
    [转]使用 WCF 和 .NET Framework 3.5 进行 HTTP 编程
    [原]Silverlight3 支持所有HTTP方法
    [原]RESTful Web Service之以HTTP PUT方式调用WCF服务
    [原]Google API学习2:Google API稍深入一步
  • 原文地址:https://www.cnblogs.com/yougewe/p/5513949.html
Copyright © 2020-2023  润新知