uploader上傳
Uploader模塊管理網絡上傳任務,用於從本地上傳各種文件到服務器,並支持跨域訪問操作。通過plus.uploader可獲取上傳管理對象。Uploader上傳使用HTTP的POST方式提交數據,數據格式符合Multipart/form-data規範,即rfc1867(Form-based File Upload in HTML)協議。
方法:
- createUpload: 新建上傳任務
- enumerate: 枚舉上傳任務
- clear: 清除上傳任務
- startAll: 開始所有上傳任務
對象:
- Upload: Upload對象管理一個上傳任務
- UploadEvent: 上傳任務事件類型
- UploadState: 上傳任務的狀態,Number類型
- UploadOptions: JSON對象,創建上傳任務的參數
- UploadFileOptions: JSON對象,添加上傳文件的參數
回調方法:
- UploadCompletedCallback: 上傳任務完成時的回調函數
- UploadStateChangedCallback: 上傳任務狀態變化回調函數,在上傳任務狀態發生變化時調用
- UploadEnumerateCallback: 枚舉上傳任務回調函數,在枚舉上傳任務完成時時調用
權限:
5+功能模塊(permissions)
{
// ...
"permissions":{
// ...
"Uploader": {
"description": "文件上傳,管理文件上傳任務"
}
}
}
Upload
Upload對象管理一個上傳任務
interface Upload {
readonly attribute String url;
readonly attribute Number state;
readonly attribute UploadOptions options;
readonly attribute String responseText;
readonly attribute Number uploadedSize;
readonly attribute Number totalSize;
function void abort();
function Boolean addData( String key, String value );
function void addEventListener( String event, function Callback listener, Boolean capture );
function Boolean addFile( String path, UploadFileOptions options );
function String getAllResponseHeaders();
function String getResponseHeader( headerName );
function void pause();
function void resume();
function void setRequestHeader( String headerName, String headerValue );
function void start();
}
屬性:
- id: 上傳任務的標識
- url: 上傳文件的服務器地址
- state: 任務的狀態
- options: 上傳任務的參數
- responseText: 上傳任務完成後服務器返回的數據
- uploadedSize: 已完成上傳數據的大小)
- totalSize: 上傳數據的總大小
方法:
- addFile: 添加上傳文件
- addData: 添加上傳數據
- start: 開始上傳任務
- pause: 暫停上傳任務
- resume: 恢復暫停的上傳任務
- abort: 取消上傳任務
- addEventListener: 添加上傳任務事件監聽器
- getAllResponseHeaders: 獲取上傳請求HTTP響應頭部信息
- getResponseHeader: 獲取上傳請求指定的HTTP響應頭部的值
- setRequestHeader: 設置上傳請求的HTTP頭數據
UploadEvent
上傳任務事件類型
常量:
-
statechanged
: _(String 類型 )_上傳任務狀態變化事件當上傳任務狀態發生變化時觸發此事件,事件原型參考UploadStateChangedCallback。
UploadState
上傳任務的狀態,Number類型
常量:
-
undefined: _(undefined 類型 )_上傳任務未開始
通過plus.uploader.createUpload()方法創建上傳任務後的初始狀態,此時可調用其start()方法開始上傳。
-
0: _(number 類型 )_上傳任務開始調度
調用上傳任務的start()方法之後處於此狀態,此時上傳任務處於可調度上傳狀態。
-
1: _(number 類型 )_上傳任務開始請求
上傳任務建立網絡連接,發送請求到服務器並等待服務器的響應。
-
2: _(number 類型 )_上傳任務請求已經建立
上傳任務網絡連接已建立,服務器返回響應,準備傳輸數據內容。
-
3: _(number 類型 )_上傳任務提交數據
上傳任務提交數據,監聽statechanged事件時可多次觸發此狀態。
-
4: _(number 類型 )_上傳任務已完成
上傳任務完成數據提交併斷開連接,上傳成功或失敗都會設置爲此狀態。
-
5: _(number 類型 )_上傳任務已暫停
調用上傳任務的pause()方法將任務暫停,此時可調用其resume()方法重新開始上傳。
-
-1: _(number 類型 )_枚舉任務狀態
非上傳任務狀態,泛指所有上傳任務的狀態,用於enumerate()和clear()操作時指定作用於所有上傳任務。
UploadOptions
JSON對象,創建上傳任務的參數
屬性:
-
method
: _(String 類型 )_網絡請求類型僅支持http協議的“POST”請求。
-
blocksize
: _(number 類型 )_上傳任務每次上傳的文件塊大小(僅在支持斷點續傳的服務有效)數值類型,單位爲Byte(字節),默認值爲102400,若設置值小於等於0則表示不分塊上傳。
-
priority
: _(number 類型 )_上傳任務的優先級數值類型,數值越大優先級越高,默認優先級值爲0。
-
timeout
: _(number 類型 )_上傳任務超時時間數值類型,單位爲s(秒),默認值爲120s。 超時時間爲服務器響應請求的時間(不是上傳任務完成的總時間),如果設置爲0則表示永遠不超時。
-
retry
: _(number 類型 )_上傳任務重試次數數值類型,默認爲重試3次。
-
retryInterval
: _(Number 類型 )_上傳任務重試間隔時間數值類型,單位爲s(秒),默認值爲30s。
UploadFileOptions
JSON對象,添加上傳文件的參數
屬性:
UploadCompletedCallback
上傳任務完成時的回調函數
void uploadCompleted( Upload upload, Number status ) {
// File upload completed code.
}
說明:
在上傳任務完成時調用,上傳任務失敗也將觸發此回調。
參數:
-
upload
: ( Upload ) 必選 上傳任務對象 -
status
: ( Number ) 必選 上傳結果狀態碼
HTTP傳輸協議狀態碼,如果未獲取傳輸狀態則其值則爲0,如上傳成功其值通常爲200。
返回值:
void : 無
UploadStateChangedCallback
上傳任務狀態變化回調函數,在上傳任務狀態發生變化時調用
void onStateChanged( Upload upload, status ) {
// Upload state changed code.
}
參數:
-
upload
: ( Upload ) 必選 上傳任務對象 -
status
: ( Number ) 必選 上傳結果狀態碼
HTTP傳輸協議狀態碼,如果未獲取傳輸狀態則其值則爲0,如上傳成功其值通常爲200。
返回值:
void : 無
UploadEnumerateCallback
枚舉上傳任務回調函數,在枚舉上傳任務完成時時調用
void onEnumerated( Upload\[\] uploads ) {
// Upload enumerate completed code.
}
參數:
uploads
: ( Array[ Upload ] ) 必選 枚舉到的上傳任務對象數組
返回值:
void : 無
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="HandheldFriendly" content="true" />
<meta name="MobileOptimized" content="320" />
<title>Hello H5+</title>
<script type="text/javascript">
var server = "http://demo.dcloud.net.cn/helloh5/uploader/upload.php";
var files = [];
// 上傳文件
function upload() {
if (files.length <= 0) {
plus.nativeUI.alert("沒有添加上傳文件!");
return;
}
console.log("開始上傳:")
var wt = plus.nativeUI.showWaiting();
var task = plus.uploader.createUpload(server, {
method: "POST"
},
function (t, status) { //上傳完成
if (status == 200) {
outLine("上傳成功:" + t.responseText);
plus.storage.setItem("uploader", t.responseText);
var w = plus.webview.create("uploader_ret.html", "uploader_ret.html", {
scrollIndicator: 'none',
scalable: false
});
w.addEventListener("loaded", function () {
wt.close();
w.show("slide-in-right", 300);
}, false);
} else {
outLine("上傳失敗:" + status);
wt.close();
}
}
);
task.addData("client", "HelloH5+");
task.addData("uid", getUid());
for (var i = 0; i < files.length; i++) {
var f = files[i];
task.addFile(f.path, {
key: f.name
});
}
task.start();
}
// 拍照添加文件
function appendByCamera() {
plus.camera.getCamera().captureImage(function (p) {
appendFile(p);
});
}
// 從相冊添加文件
function appendByGallery() {
plus.gallery.pick(function (p) {
appendFile(p);
});
}
// 添加文件
var index = 1;
function appendFile(p) {
var fe = document.getElementById("files");
var li = document.createElement("li");
var n = p.substr(p.lastIndexOf('/') + 1);
li.innerText = n;
fe.appendChild(li);
files.push({
name: "uploadkey" + index,
path: p
});
index++;
empty.style.display = "none";
}
// 產生一個隨機數
function getUid() {
return Math.floor(Math.random() * 100000000 + 10000000).toString();
}
</script>
</head>
<body>
<header id="header">
<div class="nvbt iback" onclick="back()"></div>
<div class="nvtt">Uploader</div>
<div class="nvbt idoc" onclick="openDoc('Uploader Document','/doc/uploader.html')"></div>
</header>
<div id="dcontent" class="dcontent">
<br />
<p class="heading">上傳文件列表:</p>
<ul id="files" style="text-align:left;">
<p id="empty" style="font-size:12px;color:#C6C6C6;">無上傳文件</p>
</ul>
<table style="width:100%;">
<tbody>
<tr>
<td style="width:40%">
<div class="button button-select" onclick="appendByCamera()">拍照</div>
</td>
<td style="width:40%">
<div class="button button-select" onclick="appendByGallery()">相冊選取</div>
</td>
</tr>
</tbody>
</table>
<br />
<div class="button" onclick="upload()">上 傳</div>
<br />
<!--<ul class="dlist">
<li class="ditem" onclick="appendByCamera()">拍照添加文件</li>
<li class="ditem" onclick="appendByGallery()">相冊添加文件</li>
</ul>-->
</div>
<div id="output">
Uploader用於管理文件的上傳,用於從本地上傳各種文件到網絡服務器,支持跨域訪問操作。
</div>
</body>
</html>