1. 程式人生 > >File Uploader:支援進度顯示與檔案拖拽的多檔案上傳前端JS指令碼

File Uploader:支援進度顯示與檔案拖拽的多檔案上傳前端JS指令碼

File Uploader的前身是Ajax Upload。按照官方的說法,升級到FileUploader主要是添加了一些新的特性,修正了一些比較嚴重的錯誤。但在我這個使用者看來,二者最大的不同在於:File Uploader不在基於jQuery。另外,File Uploader也更加嚴格,例如返回值只能是JSON格式,等。Ajax Upload中一些需要寫到後臺伺服器上的程式碼(如上傳檔案的格式篩選),或者對前端DOM的操作(如onSubmit、onComplete事件中自定義的程式碼等),都直接整合到了File Uploader的JS指令碼中。總的說來,File Uploader是一款功能強大的JS檔案上傳外掛,支援顯示上傳進度、檔案拖拽到瀏覽器中上傳、多檔案上傳、頁面無重新整理、無序多餘外掛、跨瀏覽器、跨後臺語言等等特性。

官方網站如下:

下載的檔案目錄結構如下圖所示:


其中可供使用的是client目錄和server目錄下的若干檔案:

client目錄

fileuploader.js:主要JS指令碼檔案,前端的所有功能都在該指令碼中實現。必需。使用時需要通過<script>標籤匯入到HTML檔案中;

fileuploader.css:提供JS指令碼中所需的CSS樣式,主要包括按鈕的樣式、進度顯示的樣式以及上傳結果的樣式。必需。需要通過<link>標籤匯入HTML檔案中;

loading.gif:進度顯示所需的動態圖片檔案。必需。在fileuploader.css檔案中被呼叫。

server目錄

該目錄提供的是伺服器端程式碼的示例程式,包括:

基於Servlet實現的Java程式碼:OctetStreamReader.java

基於PHP的實現:php.php

基於Perl的實現:perl.cgi

三者擇其一即可。

下面這段程式碼是前端對File Uploader最簡單的呼叫:

<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type"content="text/html; charset=utf-8" />
<title>file uploader</title>
<script type="text/javascript"src="fileuploader.js"></script>
<link rel="stylesheet"type="text/css" href="fileuploader.css"/>
<script type="text/javascript">
window.onload = function() {
    new qq.FileUploader({
            element:document.getElementById("uploader"),
            action:"http://localhost/fileUpload/save.php",
        });
}
</script>
</head>
 
<body>
<div id="uploader"></div>
</body>
</html>

前端的一般的步驟是:

1.      匯入fileuploader.js、fileuploader.css指令碼;

2.      例項化qq.FileUploader物件

qq.FileUploader的引數陣列中包含如下屬性:

element:載入FileUploader外掛的DOM元素,通過DOM操作獲取,通常是<div>,也可以是任何塊級元素標籤,如<span>、<p>等,必需

action:伺服器端接受並儲存檔案的程式路徑,與<form>標籤中的action屬性類似,必需

params:需要傳送給伺服器端的額外資料,key-value格式的陣列,通過POST方法傳送,格式如下:

params:  {

        param1: “value1”,

        param2: “value2”

}

allowedExtensions:允許上傳的檔案的字尾名陣列,格式如下:

allowedExtensions:  [‘jpg’,  ‘gif’,  ‘bmp’,  ‘png’]

sizeLimit:上傳檔案大小的上限,單位為byte的數值(瀏覽器不一定支援本設定);

minSizeLimit:上傳檔案大小的下限,單位為byte的數值(瀏覽器同樣不一定支援);

debug:是否使用瀏覽器的控制檯列印File Uploader的除錯資訊,預設為false;

另外,引數陣列中還包含了4個事件處理函式可供實現(非必需):

檔案提交:onSubmit:  function(id,  fileName)  {}

正在上傳:onProgress:  function(id,  fileName,  loaded,  total)  {}

上傳完成:onComplete:  function(id,  fileName,  responseJSON)  {}

取消上傳:onCancel:  function(id,  fileName)  {}

其中的引數:

id,表示是第幾個上傳的檔案,從0開始計數;

fileName,表示上傳的檔名稱;

loaded,表示已經上傳了的資料大小;

total,表示總共的檔案大小;

responseJSON,表示返回的JSON資料。

引數陣列中還包含了訊息處理函式以及params的其它設定方法,不太常用,詳情頁參見官方文件。

後臺伺服器端如果想省事,可以直接使用server目錄下的相應程式碼,或按照官方給的示例改寫程式碼。

需要特別說明的是:

1.      載入FileUploader外掛的DOM元素element,其樣式在指令碼中已經固定了,就算是在給element設定了新的樣式也會被覆蓋掉。如果想修改element的樣式,需要在fileuploader.js的487行到491行(template處)以及對應的fileuploader.css樣式中修改。

2.      同理,如果想修改進度顯示的樣式,需要在fileuploader.js的494行到500行(fileTemplate處)以及對應的fileuploader.css樣式中修改。

3.      如果出現“increase post_max_size and upload_max_filesize to 10M”錯誤,需要在php.ini檔案中把post_max_size和upload_max_filesize兩項的值改到10M以上,然後重啟Apache。

4.      FileUploader上傳的檔案資料資訊,Java通過HttpServletRequest物件獲取,並能直接從中抽取資料流,不用管索引值;而PHP則通過$_FILES陣列獲取,預設的索引值為“qqfile”,該索引值在fileuploader.js檔案的964行與1197行指定,也可以在這些地方修改(雖然沒有必要)。

5.      伺服器端程式碼中設定檔案儲存路徑的位置:PHP:php.php檔案的第160行;Java:OctetStreamReader.java檔案的第102行。