44大文件(分片)上傳=前端部分

1、百度文檔```html<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>    <link rel="stylesheet" type="text/css" href="./webuploader.css">    <script type="text/javascript" src="./jquery.js"></script>    <script type="text/javascript" src="./webuploader.js"></script></head><body><div id="uploader" class="wu-example">    <!--用來存放文件信息-->    <div id="thelist" class="uploader-list"></div>    <div class="btns">        <div id="picker">選擇文件</div>       <!--<button id="ctlBtn" class="btn btn-default">開始上傳</button>-->    </div></div></body></html><script type="text/javascript">    jQuery(function() {        var $ = jQuery;        var $list = $('#thelist');        /*var $btn = $('#ctlBtn');*/        var state = 'pending';        var uploader;        uploader = WebUploader.create({            // swf文件路徑            swf: './Uploader.swf',            // 文件接收服務端。            server: 'http://webuploader.duapp.com/server/fileupload.php',            // 選擇文件的按鈕。可選。            // 內部根據當前運行是建立,多是input元素,也多是flash.            pick: '#picker',//上傳按鈕的id            //是否要分片處理大文件上傳。            chunked:true,            //若是要分片,分多大一片? 默認大小爲5M.            chunkSize :1024*1024*20,            // 不壓縮image, 默認若是是jpeg,文件上傳前會壓縮一把再上傳!            resize: false        });        // 當有文件被添加進隊列的時候        uploader.on( 'fileQueued', function( file ) {            console.log(file.id);            console.log(file.name);            $list.append( '<div id="' + file.id + '" class="item">' +                    '<h4 class="info">' + file.name + '</h4>' +                    '<p class="state">百分比</p>' +                    '</div>' );        });        // 文件上傳過程當中建立進度條實時顯示。        uploader.on( 'uploadProgress', function( file, percentage ) {            var $div = $( '#'+file.id );            var $percent = $div.find('.progress .progress-bar');            // 避免重複建立            if ( !$percent.length ) {                $percent = $div.append('<div class="progress progress-striped active">' +                        '<div class="progress-bar" role="progressbar" style="width: 0%">' +                        '</div>' +                        '</div>').find('.progress-bar');            }            $div.find('p.state').text('上傳中');            $percent.css( 'width', percentage * 100 + '%' );        });        uploader.on( 'uploadSuccess', function( file ) {            $( '#'+file.id ).find('p.state').text('已上傳');        });        uploader.on( 'uploadError', function( file ) {            $( '#'+file.id ).find('p.state').text('上傳出錯');        });        uploader.on( 'uploadComplete', function( file ) {            $( '#'+file.id ).find('.progress').fadeOut();        });    });</script>```來源:http://fex.baidu.com/webuploader/getting-started.html2、JQuery版實例```html<!DOCTYPE html><html lang="en"><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>    <title>設備升級</title>    <link href="../static/css/webuploader.css" rel="stylesheet" type="text/css"/>    <script type="text/javascript" src="../static/js/jquery.min.js"></script>    <script type="text/javascript" src="../static/js/webuploader.js"></script></head><body><div class="place">    <span>位置:</span>    <ul class="placeul">        <li><a href="#">首頁</a></li>        <li><a href="#">系統-設備信息</a></li>    </ul></div><div class="deviceInformation">    <ul class="detail">        <li class="item">名稱:<span id="name">工業監測審計系統</span></li>        <li class="item">型號:<span id="type">INA-200</span></li>        <li class="item">硬件版本:<span id="hardwareVersion">INA-200-V1802005C</span></li>        <li class="item">軟件版本:<span id="softwareVersion">V2.0</span></li>        <li>            <div id="picker">請選擇</div>   <!-- 上傳按鈕,必須指定id選擇器的值 -->            <div class="progress">         <!-- 進度條 -->                <div class="progress-bar progress-bar-striped active" role="progressbar" style="width:0%;"></div>            </div>        </li>        <li class="item">序列號:<span id="serialNumber">CY18-NA2B-A018-5081</span></li>        <li class="item">製造商:<span id="manufacturer"> 科技(北京)有限公司</span></li>        <li class="item">出廠日期:<span id="productionDate">2018年2月10日</span></li>    </ul></div></body></html><script type="text/javascript">    $(document).ready(function() {        $.ajax({            type: 'get',            data: "system_deviceInformation",            url: "/system/devinfo/getinfo",            success: function (data) {                $("#name").html(data.name);                $("#type").html(data.type);                $("#hardwareVersion").html(data.hardwareVersion);                $("#softwareVersion").html(data.softwareVersion);                $("#serialNumber").html(data.serialNumber);                $("#manufacturer").html(data.manufacturer);                $("#productionDate").html(data.productionDate);            }        });        var task_id = WebUploader.Base.guid();        //生成惟一的ID        var uploader = WebUploader.create({           //建立上傳控件            swf: '../static/js/Uploader.swf', //swf位置,這個可能與flash有關            server: '/upload/accept',                 //接收每個分片的服務器地址            pick: '#picker',                          //上傳按鈕的id            auto: true,                               //選擇文件後,是否自動上傳            chunked: true,                            //是否分片            chunkSize: 20 * 1024 * 1024,              //每一個分片的大小,這裏爲20M            chunkRetry: 3,                            //某分片若上傳失敗,重試次數            threads: 1,                               //線程數量,考慮到服務器,這裏就選了1            duplicate: true,                          //分片是否自動去重            formData: {                               //每次上傳分片,一塊兒攜帶的數據                task_id: task_id,            },        });        uploader.on('startUpload', function() {       //開始上傳時,調用該方法            $('.progress-bar').css('width', '0%');            $('.progress-bar').text('0%');        });        uploader.on('uploadProgress', function(file, percentage) { //一個分片上傳成功後,調用該方法            $('.progress-bar').css('width', percentage * 100 - 1 + '%');            $('.progress-bar').text(Math.floor(percentage * 100 - 1) + '%');        });        uploader.on('uploadSuccess', function(file) { //整個文件的全部分片都上傳成功,調用該方法            //上傳的信息(文件惟一標識符,文件名)            var data = {'task_id': task_id, 'filename': file.source['name'] };            $.get('/upload/complete', data);          //ajax攜帶data向該url發請求            $('.progress-bar').css('width', '100%');            $('.progress-bar').text('上傳完成');        });        uploader.on('uploadError', function(file) {   //上傳過程當中發生異常,調用該方法            $('.progress-bar').css('width', '100%');            $('.progress-bar').text('上傳失敗');        });        uploader.on('uploadComplete', function(file) {//上傳結束,不管文件最終是否上傳成功,該方法都會被調用            $('.progress-bar').removeClass('active progress-bar-striped');        });    });</script>```來源:https://blog.csdn.net/jinixin/article/details/775451403、angular版實例1(初始化階段執行下面代碼)```javascriptif ($scope.file_.uploader) return;var task_id = WebUploader.Base.guid(); //生成惟一的ID$scope.file_.uploader = WebUploader.create({ //建立上傳控件    server: './system/devinfo/upload', //接收每個分片的服務器地址    pick: '#device-updata-button', //上傳按鈕的id    auto: true, //選擇文件後,是否自動上傳    chunked: true, //是否分片    chunkSize: 20 * 1024 * 1024, //每一個分片的大小,這裏爲20M    chunkRetry: 3, //某分片若上傳失敗,重試次數    threads: 1, //線程數量,考慮到服務器,這裏就選了1    duplicate: true, //分片是否自動去重    formData: { //每次上傳分片,一塊兒攜帶的數據        task_id: task_id,    },});$scope.file_.uploader.on('startUpload', function () { //開始上傳時,調用該方法    dir_alert.set({        title: '文件上傳中...',        click_other_hidden: false,        icon_close: false,        esc_close: false,        theme: {            width: '380px'        },        tpl: '<div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">0%</div></div>' +        '<div style="display: flex;' +        'justify-content: flex-start;' +        'align-items: center;' +        'flex-direction: column;">' +        '<p class="text-center" style="margin:10px 0;">已經加載文件<span class="progress-ed"></span>....</p>' +        '<img src="../../static/img/icon-updata.png" style="margin:30px 0;" width="37px" height="40px">' +        '<button type="button" ng-click="cancel()"  ng-bind="button_txt"  class="btn btn-default" style="color:#d9534f;border:1px solid #d9534f;background:#fff;"></button></div>',        tpl_scope: {            button_txt: '取消上傳',            cancel: function () {                $scope.file_.uploader.stop(true);                dir_alert.show(false);            }        },    })});$scope.file_.uploader.on('uploadProgress', function (file, percentage) { //一個分片上傳成功後,調用該方法    $('.progress-bar').css('width', percentage * 100 - 1 + '%');    $('.progress-bar').text(Math.floor(percentage * 100 - 1) + '%');    $('.progress-ed').text(Math.floor(percentage * 100 - 1) + '%');});$scope.file_.uploader.on('uploadSuccess', function (file) { //整個文件的全部分片都上傳成功,調用該方法 上傳的信息(文件惟一標識符,文件名)    var data = {        'task_id': task_id,        'filename': file.source['name']    };    $.get('./system/devinfo/complete', data); //ajax攜帶data向該url發請求    $('.progress-bar').css('width', '100%');    $('.progress-ed').text('100%');    $('.progress-bar').text('上傳完成');    $timeout(function () {        dir_alert.show(false);        dir_alert.set({            title: '設備升級中...',            click_other_hidden: false,            icon_close: false,            esc_close: false,            theme: {                width: '380px'            },            tpl: '<div  ng-init="init()" style="display: flex;' +            'justify-content: flex-start;' +            'align-items: center;' +            'flex-direction: column;">' +            '<img src="../../static/img/wait82_82px.png" class="updata-circle" style="margin:30px 0;" width="50px" height="50px">' +            '<p class="text-center" style="margin:10px 0;">設備升級中,大約須要時間<span style="color:red" ng-bind="time_s">15:00</span>,請耐心等待。</p></div>',            tpl_scope: {                timeval: null,                time_s: '15:00',                time: 15 * 60,                init: function () {                    var that = this;                    that.timeval = $interval(function () {                        that.time = that.time - 1;                        if (that.time === 0) {                            that.timeval ? $interval.cancel(that.timeval) : angular.noop();                            account_m.exit();                            dir_alert.show(false);                            $timeout(function () {                                dir_alert.set({                                    button: true,                                    cancel_hiden: true,                                    title: '升級結果',                                    tpl: '升級成功!請從新登陸。'                                });                            }, 1500)                            return;                        }                        var h = parseInt(that.time / 60);                        var min = that.time % 60;                        that.time_s = (h < 10 ? '0' + h : h) + ':' + (min < 10 ? '0' + min : min);                    }, 1000);                }            },        })    }, 2000)});$scope.file_.uploader.on('uploadError', function (file) {    $('.progress-bar').css('width', '100%');    $('.progress-bar').text('上傳失敗');});```4、angular版實例2(初始化階段執行下面代碼)```html<div class="common-card-style">    <form enctype="multipart/form-data" method="post" id="protocol-private-file-upload-form">      <div class="form-inline protocol-private-row">        <div class="form-group">          <label>            <span>*</span>            <span>協議名稱</span>          </label>          <input type="text" class="form-control" name="name" ng-model="protocol_form.name"            id="protocol-private-protocol-name" style="padding-left: 50px;width:400px;" maxlength="40">          <span class="pre-protocol-string">UDF-</span>        </div>      </div>      <div class="form-inline protocol-private-row">        <div class="form-group">          <label>            <span>*</span>            <span>協議腳本</span>          </label>          <button type="button" class="btn btn-outline-primary protocol-private-upload-button">            選擇文件            <input type="file" name="rule" onchange="angular.element(this).scope().fileChanged1(this)">          </button>          <span            ng-class="{'text-primary':files_list1[0].name,'text-danger':!files_list1[0].name}">{{files_list1[0].name||'請選擇 .lua格式文件'}}</span>        </div>      </div>      <div class="form-inline protocol-private-row">        <div class="form-group ">          <label>            <span>*</span>            <span>協議描述</span>          </label>          <button type="button" class="btn btn-outline-primary protocol-private-upload-button">            選擇文件            <input type="file" name="segment" onchange="angular.element(this).scope().fileChanged2(this)">          </button>          <span            ng-class="{'text-primary':files_list2[0].name,'text-danger':!files_list2[0].name}">{{files_list2[0].name||'請選擇 .proto格式文件'}}</span>        </div>      </div>      <div class="form-inline protocol-private-row">        <div class="form-group">          <label></label>          <button type="submit" ng-click="start_upload()" style="width: 250px" class="btn btn-primary"            ng-disabled="!files_list1[0].name||!files_list2[0].name||!protocol_form.name">導入</button>        </div>      </div>    </form>  </div>``````javascript$scope.fileChanged1 = function (ele) {        $scope.files_list1 = ele.files;        $scope.$apply();      };      $scope.fileChanged2 = function (ele) {        $scope.files_list2 = ele.files;        $scope.$apply();      };      $scope.start_upload = function () {        var formdata = new FormData(document.getElementById('protocol-private-file-upload-form'));        var protocol_name = $('#protocol-private-protocol-name').val();        formdata.set('name', ('UDF-' + protocol_name));        $.ajax({          url: '/protocol/selfdefine/upload',          type: 'post',          data: formdata,          processData: false,          contentType: false,          success: function (res) {            if (res.status === 1) {              $scope.g_tip('上傳成功!');              $scope.pagin_init.reload();              $scope.files_list1 = '';              $scope.files_list2 = '';              $scope.protocol_form.name = '';              angular.element('input[type = file]')[0].value = '';              angular.element('input[type = file]')[1].value = '';            } else if (res.status === 0) {              $scope.g_alert(res.msg);            } else if (res.status === 1000) {              dir_alert.set({                button: true,                cancel_hiden: true,                click_other_hidden: false,                icon_close: false,                title: '錯誤',                content: '當前會話已過時,即將跳到登陸頁。',              });              account_m.exit();            } else {              $scope.g_alert('上傳失敗!');            }          },          error: function () {            $scope.g_alert('通訊失敗!');          }        });      };```5、在angular項目中,怎樣將元素自己傳入到元素的事件中```html<input type="file" name="rule" onchange="angular.element(this).scope().fileChanged1(this)">```使用ng-change指令,致使輸入一個文本就會查詢一次,頻繁的調接口,對服務器形成沒必要要的壓力。使用ng-change指令,可是添加延時,延時執行調接口,這裏延時多少才合適是個問題。換成原生change事件,用戶輸入結束後,input失焦,才調接口。一、問題描述:(1)在angular項目中,爲何不這樣:<input type="file" name="segment" ng-change="angular.element(this).scope().fileChanged2(this)">(2)在angular項目中,爲何不這樣:<input type="file" name="segment" ng-change="fileChanged2(this)">(3)在angular項目中,調用原生事件:<input type="file" name="segment" onchange="angular.element(this).scope().fileChanged2(this)">二、問題釋疑:(1)既然用ng-change,應該直接調用"fileChanged2(this)"方法,不該該用"angular.element(this).scope()."來尋找方法。(2)既然用ng-change,若是直接調用"fileChanged2(this)"方法,this會被認爲是鼠標事件對象,而不是input元素。(3)使用onchange原生事件,使用JS語句angular.element(this).scope().fileChanged2(this)將input元素即this傳入。6、bootstrap進度條動態使用方法(兩層div標籤)一、外層 class="progress" style="width:300px" ng-show="true",規定展現區樣式、寬度、是否顯示。一、內層 class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuenow="60" aria-valuemax="100" ng-style="{width: XXX}",規定展現區樣式、角色、最小展值、默認展現值、最大展現值、當前展現值,其中最大值和最小值供當前值計算佔比。```html<div class="progress" style="width:300px" ng-show="init_study.state==='1'">    <div class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuenow="60" aria-valuemax="100"         ng-style="{width: init_study.progress}">        {{init_study.progress}}<!--進度條上展現的文字內容-->    </div></div>```7、HTML5 Blob 實現文件下載功能一、建立a元素 var a = document.createElement('a');二、建立當前文件的內存URL a.href = URL.createObjectURL(blob);/*爲下載文件建立本地url,後臺返回result,應當下載的那部分即blob=result.data*/三、下載當前文件 a.download = un_code.utf8Decode(data.headers('filename'));/*爲下載文件建立本地文件名,data.headers('filename')獲取服務器端文件名,un_code.utf8Decode是自定義方法,用於把其它編碼的文件轉換成utf-8編碼,*/四、自動點擊 a.click();五、移除元素 $(a).remove();
相關文章
相關標籤/搜索