首先,實現上傳功能。上傳功能是利用PHP實現的:
創建一個文件上傳表單
其中,<form> 標籤的 enctype 屬性規定了在提交表單時要使用哪種內容類型。在表單需要二進制數據時,比如文件內容,請使用 "multipart/form-data"。
<input> 標籤的 type="file" 屬性規定了應該把輸入作爲文件來處理。當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。
創建上傳腳本
"upload_file.php" 文件含有供上傳文件的代碼:
01 |
<?php |
02 |
if ( $_FILES [ "file" ][ "error" ]
> 0) |
03 |
{ |
04 |
echo "Error:
" . $_FILES [ "file" ][ "error" ]
. "<br
/>" ; |
05 |
} |
06 |
else |
07 |
{ |
08 |
echo "Upload:
" . $_FILES [ "file" ][ "name" ]
. "<br
/>" ; |
09 |
echo "Type:
" . $_FILES [ "file" ][ "type" ]
. "<br
/>" ; |
10 |
echo "Size:
" .
( $_FILES [ "file" ][ "size" ]
/ 1024) . "
Kb<br />" ; |
11 |
echo "Stored
in: " . $_FILES [ "file" ][ "tmp_name" ]; |
12 |
} |
13 |
?> |
通過使用 PHP 的全局數組 $_FILES,你可以從客戶計算機向遠程服務器上傳文件。
第一個參數是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"。就像這樣:
- $_FILES["file"]["name"] - 被上傳文件的名稱
- $_FILES["file"]["type"] - 被上傳文件的類型
- $_FILES["file"]["size"] - 被上傳文件的大小,以字節計
- $_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
- $_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
上傳限制
在這個腳本中,增加對文件上傳的限制。用戶只能上傳 .gif 或 .jpeg 文件,文件大小必須小於 20 kb:
01 |
<?php |
02 |
|
03 |
if ((( $_FILES [ "file" ][ "type" ]
== "image/gif" ) |
04 |
||
( $_FILES [ "file" ][ "type" ]
== "image/jpeg" ) |
05 |
||
( $_FILES [ "file" ][ "type" ]
== "image/pjpeg" )) |
06 |
&&
( $_FILES [ "file" ][ "size" ]
< 20000)) |
07 |
{ |
08 |
if ( $_FILES [ "file" ][ "error" ]
> 0) |
09 |
{ |
10 |
echo "Error:
" . $_FILES [ "file" ][ "error" ]
. "<br
/>" ; |
11 |
} |
12 |
else |
13 |
{ |
14 |
echo "Upload:
" . $_FILES [ "file" ][ "name" ]
. "<br
/>" ; |
15 |
echo "Type:
" . $_FILES [ "file" ][ "type" ]
. "<br
/>" ; |
16 |
echo "Size:
" .
( $_FILES [ "file" ][ "size" ]
/ 1024) . "
Kb<br />" ; |
17 |
echo "Stored
in: " . $_FILES [ "file" ][ "tmp_name" ]; |
18 |
} |
19 |
} |
20 |
else |
21 |
{ |
22 |
echo "Invalid
file" ; |
23 |
} |
24 |
|
25 |
?> |
註釋:對於 IE,識別 jpg 文件的類型必須是 pjpeg,對於 FireFox,必須是 jpeg。
保存被上傳的文件
上面的例子在服務器的 PHP 臨時文件夾創建了一個被上傳文件的臨時副本。
這個臨時的複製文件會在腳本結束時消失。要保存被上傳的文件,我們需要把它拷貝到另外的位置:
01 |
<?php |
02 |
if ((( $_FILES [ "file" ][ "type" ]
== "image/gif" ) |
03 |
||
( $_FILES [ "file" ][ "type" ]
== "image/jpeg" ) |
04 |
||
( $_FILES [ "file" ][ "type" ]
== "image/pjpeg" )) |
05 |
&&
( $_FILES [ "file" ][ "size" ]
< 20000)) |
06 |
{ |
07 |
if ( $_FILES [ "file" ][ "error" ]
> 0) |
08 |
{ |
09 |
echo "Return
Code: " . $_FILES [ "file" ][ "error" ]
. "<br
/>" ; |
10 |
} |
11 |
else |
12 |
{ |
13 |
echo "Upload:
" . $_FILES [ "file" ][ "name" ]
. "<br
/>" ; |
14 |
echo "Type:
" . $_FILES [ "file" ][ "type" ]
. "<br
/>" ; |
15 |
echo "Size:
" .
( $_FILES [ "file" ][ "size" ]
/ 1024) . "
Kb<br />" ; |
16 |
echo "Temp
file: " . $_FILES [ "file" ][ "tmp_name" ]
. "<br
/>" ; |
17 |
|
18 |
if ( file_exists ( "upload/" . $_FILES [ "file" ][ "name" ])) |
19 |
{ |
20 |
echo $_FILES [ "file" ][ "name" ]
. "
already exists. " ; |
21 |
} |
22 |
else |
23 |
{ |
24 |
move_uploaded_file( $_FILES [ "file" ][ "tmp_name" ], |
25 |
"upload/" . $_FILES [ "file" ][ "name" ]); |
26 |
echo "Stored
in: " . "upload/" . $_FILES [ "file" ][ "name" ]; |
27 |
} |
28 |
} |
29 |
} |
30 |
else |
31 |
{ |
32 |
echo "Invalid
file" ; |
33 |
} |
34 |
?> |
上面的腳本檢測了是否已存在此文件,如果不存在,則把文件拷貝到指定的文件夾。
注意,要在目錄下創建 "upload"文件夾要不然會出現錯誤。
前面這些內容在W3C中都可以找到相應的介紹,接下來就是把PHP和JqueryMobile結合起來實現圖片上傳了。
本以爲簡單的加上Mobile的東西就行了,但是問題出現了:使用了JqueryMobile之後出現了無限Loading的情況、
原因是JQM把表單提交做成了異步,只需要在form中加上 data-ajax="false" 即可。
完整步驟如下:
先是用戶頁面index.php:
01 |
<!DOCTYPE
HTML> |
02 |
|
03 |
< html > |
04 |
|
05 |
< head > |
06 |
< meta http-equiv = "Content-Type" content = "text/html;
charset=utf-8" /> |
07 |
< meta name = "viewport" content = "width=device-width,
minimum-scale=1, maximum-scale=1" > |
08 |
< link rel = "stylesheet" href = "http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css" > |
09 |
< script src = "http://code.jquery.com/jquery-1.5.min.js" ></ script > |
10 |
< script src = "http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js" ></ script > |
11 |
</ head > |
12 |
|
13 |
< body > |
14 |
|
15 |
< div data-role = "page" > |
16 |
|
17 |
< div data-role = "header" > |
18 |
< h1 >演示PHP上傳文件</ h1 > |
19 |
</ div > <!--
/header --> |
20 |
|
21 |
< div data-role = "content" > |
22 |
< form action = "upload_file.php" method = "post" enctype = "multipart/form-data" data-ajax = "false" > |
23 |
< label for = "file" >文件名稱</ label > |
24 |
< input type = "file" name = "file" id = "file" /> |
25 |
< br /> |
26 |
< input type = "submit" name = "submit" value = "上傳!" /> |
27 |
</ form > |
28 |
</ div > <!--
/content --> |
29 |
|
30 |
< div data-role = "footer" > |
31 |
< h4 >存到upload文件夾</ h4 > |
32 |
</ div > <!--
/footer --> |
33 |
|
34 |
</ div > <!--
/page --> |
35 |
</ body > |
36 |
|
37 |
</ body > |
38 |
</ html > |
接着是上傳處理的頁面upload_file.php:
01 |
<!DOCTYPE
HTML> |
02 |
|
03 |
< html > |
04 |
|
05 |
< head > |
06 |
< meta http-equiv = "Content-Type" content = "text/html;
charset=utf-8" /> |
07 |
< meta name = "viewport" content = "width=device-width,
minimum-scale=1, maximum-scale=1" > |
08 |
< link rel = "stylesheet" href = "http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css" > |
09 |
< script src = "http://code.jquery.com/jquery-1.5.min.js" ></ script > |
10 |
< script src = "http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js" ></ script > |
11 |
</ head > |
12 |
|
13 |
< body > |
14 |
|
15 |
<!--
顯示圖片信息 --> |
16 |
< div data-role = "page" > |
17 |
|
18 |
< div data-role = "header" > |
19 |
< h1 >顯示PHP上傳的文件信息</ h1 > |
20 |
</ div > <!--
/header --> |
21 |
|
22 |
< div data-role = "content" > |
23 |
<? php |
24 |
if
($_FILES["file"]["error"] > 0) |
25 |
{ |
26 |
echo
"錯誤代碼: " . $_FILES["file"]["error"] . "< br />"; |
27 |
} |
28 |
else |
29 |
{ |
30 |
echo
"文件名稱: " . $_FILES["file"]["name"] . "< br />"; |
31 |
echo
"文件類型: " . $_FILES["file"]["type"] . "< br />"; |
32 |
echo
"文件大小: " . ($_FILES["file"]["size"] / 1024) . " Kb< br />"; |
33 |
echo
"臨時路徑: " . $_FILES["file"]["tmp_name"] . "< br />"; |
34 |
if
(file_exists("upload/" . $_FILES["file"]["name"])) |
35 |
{ |
36 |
echo
"該文件已經存在"; |
37 |
} |
38 |
else |
39 |
{ |
40 |
move_uploaded_file($_FILES["file"]["tmp_name"],"upload/"
. $_FILES["file"]["name"]); |
41 |
echo
"存儲路徑: " . "upload/" . $_FILES["file"]["name"]; |
42 |
} |
43 |
} |
44 |
?> |
45 |
</ div > <!--
/content --> |
46 |
|
47 |
< div data-role = "footer" > |
48 |
< a href = "#myimage" >點擊查看圖片</ a > |
49 |
</ div > <!--
/footer --> |
50 |
|
51 |
</ div > <!--
/page --> |
52 |
|
53 |
|
54 |
<!--
顯示圖片的div --> |
55 |
< div data-role = "page" id = "myimage" > |
56 |
< img src = "<?php
echo " upload/".$_FILES["file"]["name"]?>"/> |
57 |
</ div > <!--
/page --> |
58 |
|
59 |
|
60 |
</ body > |
61 |
|
62 |
</ body > |
63 |
</ html > |
在虛擬機的瀏覽器地址欄輸入10.0.2.2或者在同一個局域網下的移動設備中輸入192.168.1.101訪問頁面: