html5+ Uploader-上傳

uploader上傳

Uploader模塊管理網絡上傳任務,用於從本地上傳各種文件到服務器,並支持跨域訪問操作。通過plus.uploader可獲取上傳管理對象。Uploader上傳使用HTTP的POST方式提交數據,數據格式符合Multipart/form-data規範,即rfc1867(Form-based File Upload in HTML)協議。

方法:

對象:

回調方法:

權限:

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: 上傳數據的總大小

方法:

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對象,添加上傳文件的參數

屬性:

  • key: 文件鍵名
  • name: 文件名稱
  • mime: 文件類型

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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章