## 文件上傳
### 1.引入資源
使用Web Uploader文件上傳需要引入三種資源:JS, CSS, SWF。
~~~
<!--引入CSS-->
<link rel="stylesheet" type="text/css" href="webuploader文件夾/webuploader.css">
<!--引入JS-->
<script type="text/javascript" src="webuploader文件夾/webuploader.js"></script>
<!--SWF在初始化的時候指定,在后面將展示-->
~~~
### 2.文件上傳
WebUploader只包含文件上傳的底層實現,不包括UI部分。所以交互方面可以自由發揮,以下將演示如何去實現一個簡單的版本。
請點擊下面的選擇文件按鈕,然后點擊開始上傳體驗此Demo。
Html部分
首先準備dom結構,包含存放文件信息的容器、選擇按鈕和上傳按鈕三個部分。
~~~
<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>
~~~
### 4.初始化Web Uploader
具體說明,請看一下代碼中的注釋部分。
~~~
var uploader = WebUploader.create({
// swf文件路徑
swf: BASE_URL + '/js/Uploader.swf',
// 文件接收服務端。
server: 'http://webuploader.duapp.com/server/fileupload.php',
// 選擇文件的按鈕。可選。
// 內部根據當前運行是創建,可能是input元素,也可能是flash.
pick: '#picker',
// 不壓縮image, 默認如果是jpeg,文件上傳前會壓縮一把再上傳!
resize: false
});
~~~
### 5.顯示用戶選擇
由于webuploader不處理UI邏輯,所以需要去監聽fileQueued事件來實現。
~~~
// 當有文件被添加進隊列的時候
uploader.on( 'fileQueued', function( file ) {
$list.append( '<div id="' + file.id + '" class="item">' +
'<h4 class="info">' + file.name + '</h4>' +
'<p class="state">等待上傳...</p>' +
'</div>' );
});
~~~
### 6.文件上傳進度
文件上傳中,Web Uploader會對外派送uploadProgress事件,其中包含文件對象和該文件當前上傳進度。
~~~
// 文件上傳過程中創建進度條實時顯示。
uploader.on( 'uploadProgress', function( file, percentage ) {
var $li = $( '#'+file.id ),
$percent = $li.find('.progress .progress-bar');
// 避免重復創建
if ( !$percent.length ) {
$percent = $('<div class="progress progress-striped active">' +
'<div class="progress-bar" role="progressbar" style="width: 0%">' +
'</div>' +
'</div>').appendTo( $li ).find('.progress-bar');
}
$li.find('p.state').text('上傳中');
$percent.css( 'width', percentage * 100 + '%' );
});
~~~
### 7.文件成功、失敗處理
文件上傳失敗會派送uploadError事件,成功則派送uploadSuccess事件。不管成功或者失敗,在文件上傳完后都會觸發uploadComplete事件。
~~~
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();
});
~~~
8.JS代碼文件
以下是Js引入的代碼
~~~
// 文件上傳
jQuery(function() {
var $ = jQuery,
$list = $('#thelist'),
$btn = $('#ctlBtn'),
state = 'pending',
uploader;
uploader = WebUploader.create({
// 不壓縮image
resize: false,
// swf文件路徑
swf: BASE_URL + '/js/Uploader.swf',
// 文件接收服務端。
server: 'http://webuploader.duapp.com/server/fileupload.php',
// 選擇文件的按鈕。可選。
// 內部根據當前運行是創建,可能是input元素,也可能是flash.
pick: '#picker'
});
// 當有文件添加進來的時候
uploader.on( 'fileQueued', function( file ) {
$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 $li = $( '#'+file.id ),
$percent = $li.find('.progress .progress-bar');
// 避免重復創建
if ( !$percent.length ) {
$percent = $('<div class="progress progress-striped active">' +
'<div class="progress-bar" role="progressbar" style="width: 0%">' +
'</div>' +
'</div>').appendTo( $li ).find('.progress-bar');
}
$li.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();
});
uploader.on( 'all', function( type ) {
if ( type === 'startUpload' ) {
state = 'uploading';
} else if ( type === 'stopUpload' ) {
state = 'paused';
} else if ( type === 'uploadFinished' ) {
state = 'done';
}
if ( state === 'uploading' ) {
$btn.text('暫停上傳');
} else {
$btn.text('開始上傳');
}
});
$btn.on( 'click', function() {
if ( state === 'uploading' ) {
uploader.stop();
} else {
uploader.upload();
}
});
});
~~~