Plupload
Plupload是有TinyMCE的開發者開發的,為您的內容管理系統或是類似上傳程序提供一個高度可用的上傳插件。Plupload 目前分為一個核心API 和一個jQuery上傳隊列部件,這樣使你可以直接使用或是自己定制。
功能和特點:
1、擁有多種上傳方式:HTML5、flash、silverlight以及傳統的<input type=”file” />。Plupload會自動偵測當前的環境,選擇最合適的上傳方式,並且會優先使用HTML5的方式。所以你完全不用去操心當前的瀏覽器支持哪些上傳方式,Plupload會自動為你選擇最合適的方式。
2、支持以拖拽的方式來選取要上傳的文件
3、支持在前端壓縮圖片,即在圖片文件還未上傳之前就對它進行壓縮
4、可以直接讀取原生的文件數據,這樣的好處就是例如可以在圖片文件還未上傳之前就能把它顯示在頁面上預覽
5、支持把大文件切割成小片進行上傳,因為有些瀏覽器對很大的文件比如幾G的一些文件無法上傳。
6、支持文件過濾上傳
依賴及兼容
依賴性
不依賴於任何庫和框架
兼容性
支持Firefox、Chrome、 Safari、 IE6,7,8,9,10,11
注意:
1、分塊:chrome和firefox 4+ 支持。
2、拖拽適用於firefox和webkit內核的瀏覽器,windows版的safari還存在一些問題待解決。
3、圖片縮放僅在firefox3.5+和chrome上支持,safari/opera 不支持直接數據訪問選定的文件。
4、 多文件上傳僅支持gecko和webkit內核的瀏覽器。
安裝使用
1.引用
plupload的源文件可以到github上去下載,然后通過script標簽引用:
<script src="js/plupload.full.min.js"></script>
2.初始化
var uploader = new plupload.Uploader({
browse_button: 'browse', //觸發文件選擇對話框的按鈕,為那個元素id或者元素本身
url: 'upload.php' //文件上傳url地址
});
uploader.init();
常用案例
1.文件普通上傳
var uploader = new plupload.Uploader({
browse_button: 'browse', //觸發文件選擇對話框的按鈕,為那個元素id或者元素本身
url: 'upload.php' //文件上傳url地址
});
uploader.init()
document.getElementById('uploadfiles').onclick = function() {
uploader.start();
return false;
};
2.文件拖拽上傳
配置參數:drop_element
| 屬性 | 類型 | 默認值 | 描述 |
|---|---|---|---|
drop_element |
DOM/String/Array | 指定了使用拖拽方式來選擇上傳文件時的拖拽區域,即可以把文件拖拽到這個區域的方式來選擇文件。該參數的值可以為一個DOM元素的id,也可是 DOM元素本身,還可以是一個包括多個DOM元素的數組。如果不設置該參數則拖拽上傳功能不可用。目前只有html5上傳方式才支持拖拽上傳。 |
代碼示例:
var uploader = new plupload.Uploader({
browse_button: 'browse', //觸發文件選擇對話框的按鈕,為那個元素id或者元素本身
url: 'upload.php' //文件上傳url地址
drop_element: 'drop', //拖拽區域元素ID或者元素本身
});
uploader.init();
document.getElementById('uploadfiles').onclick = function() {
uploader.start();
return false;
};
3.圖片壓縮上傳
配置參數:resize
| 屬性 | 類型 | 默認值 | 描述 |
|---|---|---|---|
resize |
Object | 可以使用該參數對將要上傳的圖片進行壓縮,該參數是一個對象,里面包括5個屬性: width:指定壓縮后圖片的寬度,如果沒有設置該屬性則默認為原始圖片的寬度height:指定壓縮后圖片的高度,如果沒有設置該屬性則默認為原始圖片的高度crop:是否裁剪圖片quality:壓縮后圖片的質量,只對jpg格式的圖片有效,默認為90。quality可以跟width和height一起使用,但也可以單獨使用,單獨使用時,壓縮后圖片的寬高不會變化,但由於質量降低了,所以體積也會變小 preserve_headers:壓縮后是否保留圖片的元數據,true為保留,false為不保留,默認為true。刪除圖片的元數據能使圖片的體積減小一點點resize參數的配置示例如下: resize: {width: 100,height: 100,crop: true,quality: 60,preserve_headers: false} |
代碼示例:
var uploader = new plupload.Uploader({
browse_button: 'browse', //觸發文件選擇對話框的按鈕,為那個元素id或者元素本身
url: 'upload.php' //文件上傳url地址
resize: {
width: 100,
height: 100,
crop: true,
quality: 60,
preserve_headers: false
}
});
uploader.init();
document.getElementById('uploadfiles').onclick = function() {
uploader.start();
return false;
};
4.文件過濾上傳
配置參數:filters
| 屬性 | 類型 | 默認值 | 描述 |
|---|---|---|---|
filters |
Object | {} | 可以使用該參數來限制上傳文件的類型,大小等,該參數以對象的形式傳入,它包括三個屬性: mime_types:用來限定上傳文件的類型,為一個數組,該數組的每個元素又是一個對象,該對象有title和extensions兩個屬性,title為該過濾器的名稱,extensions為文件擴展名,有多個時用逗號隔開。該屬性默認為一個空數組,即不做限制。 max_file_size:用來限定上傳文件的大小,如果文件體積超過了該值,則不能被選取。值可以為一個數字,單位為b,也可以是一個字符串,由數字和單位組成,如’200kb’。prevent_duplicates:是否允許選取重復的文件,為true時表示不允許,為false時表示允許,默認為false。如果兩個文件的文件名和大小都相同,則會被認為是重復的文件filters完整的配置示例如下(當然也可以只配置其中的某一項):filters: {mime_types : [ //只允許上傳圖片和zip文件{ title : "Image files", extensions : "jpg,gif,png" },{ title : "Zip files", extensions : "zip" }],max_file_size : '400kb', //最大只能上傳400kb的文件prevent_duplicates : true //不允許選取重復文件} |
代碼示例:
var uploader = new plupload.Uploader({
browse_button: 'browse', // this can be an id of a DOM element or the DOM element itself
url: 'upload.php',
filters: {
mime_types: [ //只允許上傳圖片和zip文件
{ title: "Image files", extensions: "jpg,gif,png" },
{ title: "Zip files", extensions: "zip" }
],
max_file_size: '400kb', //最大只能上傳400kb的文件
prevent_duplicates: true //不允許選取重復文件
}
});
uploader.init();
document.getElementById('start-upload').onclick = function () {
uploader.start();
};
5.文件分片上傳
配置參數: chunk_size
| 屬性 | 類型 | 默認值 | 描述 |
|---|---|---|---|
chunk_size |
Number/String | 0 | 分片上傳文件時,每片文件被切割成的大小,為數字時單位為字節。也可以使用一個帶單位的字符串,如"200kb"。當該值為0時表示不使用分片上傳功能 |
代碼示例:
var uploader = new plupload.Uploader({
browse_button: 'browse', //觸發文件選擇對話框的按鈕,為那個元素id或者元素本身
url: 'upload.php' //文件上傳url地址
chunk_size: '200kb', //拖拽區域元素ID或者元素本身
});
uploader.init();
document.getElementById('uploadfiles').onclick = function() {
uploader.start();
return false;
};
常用事件
1.UploadProgress
會在文件上傳過程中不斷觸發,可以用此事件來顯示上傳進度監聽函數參數:(uploader,file)
uploader為當前的plupload實例對象,file為觸發此事件的文件對象
2.FilesRemoved
當文件從上傳隊列移除后觸發監聽函數參數:(uploader,files)
uploader為當前的plupload實例對象,files為一個數組,里面的元素為本次事件所移除的文件對象
3.FilesAdded
當文件添加到上傳隊列后觸發監聽函數參數:(uploader,files)
uploader為當前的plupload實例對象,files為一個數組,里面的元素為本次添加到上傳隊列里的文件對象
4.FileUploaded
當隊列中的某一個文件上傳完成后觸發監聽函數參數:(uploader,file,responseObject)
uploader為當前的plupload實例對象,file為觸發此事件的文件對象,responseObject為服務器返回的信息對象,它有以下3個屬性:
response:服務器返回的文本
responseHeaders:服務器返回的頭信息
status:服務器返回的http狀態碼,比如200
5.UploadComplete
當上傳隊列中所有文件都上傳完成后觸發監聽函數參數:(uploader,files)
uploader為當前的plupload實例對象,files為一個數組,里面的元素為本次已完成上傳的所有文件對象
6.Error:
當發生錯誤時觸發監聽函數參數:(uploader,errObject)
uploader為當前的plupload實例對象,errObject為錯誤對象,它至少包含以下3個屬性(因為不同類型的錯誤,屬性可能會不同):
code:錯誤代碼,具體請參考plupload上定義的表示錯誤代碼的常量屬性
file:與該錯誤相關的文件對象
message:錯誤信息
Plupload實例的屬性和方法
1.屬性
| 屬性 | 描述 |
|---|---|
| id | Plupload實例的唯一標識id |
| state | 當前的上傳狀態,可能的值為plupload.STARTED或plupload.STOPPED,該值由Plupload實例的stop()``或statr()方法控制。默認為plupload.STOPPED` |
| runtime | 當前使用的上傳方式 |
| files | 當前的上傳隊列,是一個由上傳隊列中的文件對象組成的數組 |
| settings | 當前的配置參數對象 |
| total | 表示總體進度信息的QueueProgress對象 |
2.方法
| 方法 | 描述 |
|---|---|
| init() | 初始化Plupload實例 |
| setOption(option, [value]) | 設置某個特定的配置參數,option為參數名稱,value為要設置的參數值。option也可以為一個由參數名和參數值鍵/值對組成的對象,這樣就可以一次設定多個參數,此時該方法的第二個參數value會被忽略。 |
| getOption([option]) | 獲取當前的配置參數,參數option為需要獲取的配置參數名稱,如果沒有指定option,則會獲取所有的配置參數 |
| start() | 開始上傳隊列中的文件 |
| stop() | 停止隊列中的文件上傳 |
| getFile(id) | 通過id來獲取文件對象 |
| addFile(file, [fileName]) | 向上傳隊列中添加文件,如果成功添加了文件,會觸發FilesAdded事件。參數file為要添加的文件,可以是一個原生的文件,或者一個plupload文件對象,或者一個input[type="file"]元素,還可以是一個包括前面那幾種東西的數組;fileName為給該文件指定的名稱 |
| removeFile(file) | 從上傳隊列中移除文件,參數file為plupload文件對象或先前指定的文件名稱 |
| splice(start, length) | 從上傳隊列中移除一部分文件,start為開始移除文件在隊列中的索引,length為要移除的文件的數量,該方法的返回值為被移除的文件。該方法會觸發FilesRemoved 和QueueChanged事件 |
| trigger(name, Multiple) | 觸發某個事件。name為要觸發的事件名稱,Multiple為傳給該事件監聽函數的參數,是一個對象 |
| hasEventListener(name) | 用來判斷某個事件是否有監聽函數,`name為``事件名稱 |
| bind(name, func, scope) | 給某個事件綁定監聽函數,name為事件名,func為監聽函數,scope為監聽函數的作用域,也就是監聽函數中this的指 |
| unbind(name, func) | 移除事件的監聽函數,name為事件名稱,func為要移除的監聽函數 |
| unbindAll() | 移除所有事件的所有監聽函數 |
| destroy() | 銷毀plupload實例 |
QueueProgress 對象的屬性
plupload實例的total屬性是一個QueueProgress對象
| 屬性 | 描述 |
|---|---|
| size | 上傳隊列中所有文件加起來的總大小,單位為字節 |
| loaded | 隊列中當前已上傳文件加起來的總大小,單位為字節 |
| uploaded | 已完成上傳的文件的數量 |
| failed | 上傳失敗的文件數量 |
| queued | 隊列中剩下的(也就是除開已經完成上傳的文件)需要上傳的文件數量 |
| percent | 整個隊列的已上傳百分比,如50就代表50% |
| bytesPerSec | 上傳速率,單位為 byte/s,也就是 字節/秒 |
文件對象的屬性和方法
在很多事件監聽函數中,都會提供文件對象給你
| 屬性/方法 | 描述 |
|---|---|
| id | 文件id |
| name | 文件名,例如”myfile.gif” |
| type | 文件類型,例如”image/jpeg” |
| size | 文件大小,單位為字節,當啟用了客戶端壓縮功能后,該值可能會改變 |
| origSize | 文件的原始大小,單位為字節 |
| loaded | 文件已上傳部分的大小,單位為字節 |
| percent | 文件已上傳部分所占的百分比,如50就代表已上傳了50% |
| status | 文件的狀態,可能為以下幾個值之一:plupload.QUEUED, plupload.UPLOADING, plupload.FAILED, plupload.DONE |
| lastModifiedDate | 文件最后修改的時間 |
| getNative() | 獲取原生的文件對象 |
| getSource() | 獲取mOxie.File 對象,想了解mOxie是什么東西,可以看下https://github.com/moxiecode/moxie/wiki/API |
| destroy() | 銷毀文件對象 |
