亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

FireFox下使用Javascript上傳大文件(php版本)

2019-11-17 03:40:04
字體:
來源:轉載
供稿:網友

  本程序是利用3.x的Firefox瀏覽器可以讀取本地文件的特性,實現通過xmlHttPRequest上傳大文件功能,并在可以上傳過程中動態顯示上傳進度。略加修改,并與服務器端配合,可以實現斷點續傳等諸多功能。

  本例主要是研究FireFox的file-input節點的一些特性,其他客戶端應用,如Flash、Sliverlight等,在實現客戶端大文件上傳時,在數據傳輸與服務器端存儲等方面,與本例的思路基本一致。

  注意:文件體積似乎有臨界點,但這個臨界點是多少尚未確認。建議不要用此方法上傳超過100M的文件。

  以下是客戶端javascript代碼

 

 

/*
* FireFoxFileSender version 0.0.0.1
* by MK winnie_mk(a)126.com
*
* 【本程序僅限于FireFox3.x版本,其他瀏覽器是否可以運行未做測試。】
* 【測試通過:FireFox 3.6.8 / Apache/2.2.11 (Win32) php/5.2.6 】
* ******************************************************************************
* 本程序是利用3.x的FireFox瀏覽器可以讀取本地文件的特性
* 實現通過xmlhttpRequest上傳大文件功能
* 并在可以上傳過程中動態顯示上傳進度
* 略加修改,并與服務器端配合,可以實現斷點續傳等諸多功能
* 本例主要是研究FireFox的file-input節點的一些特性
* 其他客戶端應用,如Flash、Sliverlight等,在實現客戶端大文件上傳時
* 在數據傳輸與服務器端存儲等方面,與本例的思路基本一致
* 注意:文件體積似乎有個臨界點,但這個臨界點是多少尚未確認。建議不要用此方法上傳超過100M的文件。
* ******************************************************************************
*/
function FireFoxFileSender(config){
var conf = config || {};
/*
* 錯誤信息隊列
*/
this.errMsg = [];
/*
* 判斷各參數是否齊備
*/
this.f = typeof conf.file == 'string' ?
     document.getElementById(conf.file) : conf.file;
if(!this.f){ this.errMsg.push('Error: Not set the input file.'); }
else if(this.f.files.length < 1){ this.errMsg.push('Error: Not select a file.'); }
else {
this.fileName = this.f.value;
/*
* 在嘗試直接發送二進制流時失敗,改用發送base64編碼數據。
*/
this.data = (this.data = this.f.files[0].getAsDataURL())
      .substr(this.data.indexOf(',') + 1);
this.length = this.data.length;
/*
* 文件實際大小
*/
this.fileSize = this.f.files[0].fileSize;
/*
* 文件類型
*/
this.contentType = this.f.files[0].fileType;
}
/*
* 服務器端接收地址
*/
this.url = conf.url;
if(!this.url){
     this.errMsg.push('Error: Not set the instance url to send binary.');
  }
/*
* 發送數據包的大小。默認100kb
*/
this.packageSize = conf.packageSize || 102400;
/*
* 每次發送數據包大小應為4的倍數,確保服務器端轉換base64編碼正確。
*/
if(this.packageSize % 4 != 0)
     this.packageSize = parseInt(this.packageSize / 4) * 4;

this.onSendFinished = conf.onSendFinished || null;
this.onSending = conf.onSending || null;
this.onError = conf.onError || null;
}
FireFoxFileSender.prototype
= {
/*
* 記錄當前發送的數據
*/
currentData :
null,
/*
* 記錄讀取位置
*/
position :
0,
/*
* 數據大小。該值為base64字符串的長度。
*/
length :
-1,
/*
* 檢查錯誤隊列,嘗試觸發onError事件
*/
checkError :
function(){
if(this.errMsg.length > 0){
/*
* 觸發onError事件
*/
typeof this.onError == 'function' && this.onError(this.errMsg);
return;
}
},
/*
* 創建XMLHttpRequest
*/
createSender :
function(){
var xhr = new XMLHttpRequest();
xhr.open(
'POST', this.url, true);
var _ = this;
xhr.onreadystatechange
= function(){
/*
* 當服務器段響應正常,則循環讀取發送。
*/
if(xhr.readyState == 4 && xhr.status == 200){
/*
* 觸發onSending事件
*/
if(typeof _.onSending == 'function') _.onSending(_, xhr);
/*
* 延時發送下一次請求,否則服務器負擔過重
*/
var send = setTimeout(function(){
_.send();
clearTimeout(send);
send
= null;
},
100);
}
}
return xhr;
},
/*
* 發送數據
*/
send :
function(){
this.checkError();
/*
* 獲取當前要發送的數據
*/
this.currentData = this.data.substr(this.position, this.packageSize);
/*
* 更改postion,模擬數據流移位
*/
this.position += this.currentData.length;
/*
* 如果讀取字符串長度大于0,則發送該數據
* 否則觸發onSendFinished事件
*/
if(this.currentData.length > 0) {
var xhr = this.createSender();
/*
* 自定義頭部信息,通知服務器端文件相關信息
* 實際應用時可修改此部分。
*/
xhr.setRequestHeader(
'#FILE_NAME#', this.fileName);
xhr.setRequestHeader(
'#FILE_SIZE#', this.length);
xhr.setRequestHeader(
'#CONTENT_TYPE#', this.contentType);

xhr.send(
this.currentData);
}
else if(typeof this.onSendFinished == 'function') {
/*
* 觸發onSendFinished事件
*/
this.onSendFinished(this);
}
},
/*
* 計算已發送數據百分比
*/
percent :
function(){
if(this.length <= 0 ) return -1;
return Math.round((this.position / this.length) * 10000) / 100;
},
onSendFinished :
null, //該事件是以本地數據發送完成為觸發,并不是服務器端返回的完成信息。
onSending : null,
onError :
null
}

/*
* 上傳按鈕事件
*/
function send(fileID){
var sender = new FireFoxFileSender(
/*
* 上傳配置文件
*/
{
/*
* input file 元素,可以是dom節點,也可以是id的字符串值
*/
file : fileID,
/*
* 接收上傳數據的服務器端地址
*/
url :
'UPLOADER.php',
/*
* 每次發送數據包的大小??筛鶕掌骶唧w情況更改。IIS6默認為200K
*/
packageSize :
'200000',
/*
* 出現錯誤時觸發該事件。本例僅在初始化時判斷各參數是否齊備,并沒有拋出發送過程中的錯誤。
*/
onError :
function(arrMsg){
alert(arrMsg.join(
'/r/n'));
sender
= null;
delete sender;
},
/*
* 發送過程中觸發該事件。本例中主要用于顯示進度。
*/
onSending :
function(sd, xhr){
var per = sd.percent();
document.getElementById(
'Message').innerHTML = per + '% ';
/*
* 該判斷是在最后一次發送結束后,通過xhr的onreadystatechange事件觸發的
* 如果傳輸過程中沒有其他錯誤,基本可以確定為服務器端接收完成
*/
if(parseInt(per) == 100){ alert('服務器端接收完成'); }
},
/*
* 該事件僅僅為【本地數據發送完成】時觸發。
* 請區別本地數據發送完成和服務器端返回完成信息這兩種情況
* 本例中并沒有對服務器接收信息的情況做響應
* 即使服務器端沒有接收和保存任何數據
* 只要確保xhr返回readyState == 4 和 status == 200
* 發送就會繼續進行
* 服務器端如何返回完成信息可以通過更改接收數據頁面的代碼自定實現
* 然后通過對xhr.responseText的值來做判斷
*/
onSendFinished :
function(){
alert(
'本地數據發送完成');
}
}
);
sender.send();
}

 

 

 

以下是服務器端php代碼

 

/*
* 獲取輸入信息
*/
$b64 = file_get_contents("php://input");
/*
* 獲取頭部信息
*/
$headers = getallheaders();
$fileName = $headers['#FILE_NAME#'];
$contentType = $headers['#CONTENT_TYPE#'];

/*
* 做一些判斷和處理...
*/

/*
* 以下是服務器端對發送數據的簡單響應
* - 假如有數據被post過來 則輸出對base64轉換為二進制流后,二進制流的長度
* - 否則輸出0
* 這僅僅是一個例子,并且在js端沒有接收這個信息
* 同樣,也可以采用在header中寫入反饋信息等等方法
* 回饋信息給客戶端
* 主要目的是確定上傳過程中是否有其他問題出現
* 以確保上傳文件完整
*/
if(!empty($b64)){
$stream = base64_decode($b64);
echo strlen($stream);
/*
* 追加方式寫入文件
* 在此修改文件保存位置
*/
$file = fopen('' . $fileName , 'a');
if($file)
if(fwrite($file, $stream))
fclose($file);
}
else echo '0';

 

 

 

 

客戶端完整代碼
1 <!DOCTYPE HTML>
2  <html>
3  <head>
4  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5  <title>FireFoxFileSender - !! ONLY FOR FireFox !!</title>
6  </head>
7
8  <body>
9  <script type="text/Javascript">
10  /*
11 * FireFoxFileSender version 0.0.0.1
12 * by MK winnie_mk(a)126.com
13 *
14 * 【本程序僅限于FireFox3.x版本,其他瀏覽器是否可以運行未做測試?!?BR> 15 * 【測試通過:FireFox 3.6.8 / Apache/2.2.11 (Win32) PHP/5.2.6 】
16 * *********************************************************************************
17 * 本程序是利用3.x的FireFox瀏覽器可以讀取本地文件的特性
18 * 實現通過XMLHttpRequest上傳大文件功能
19 * 并在可以上傳過程中動態顯示上傳進度
20 * 略加修改,并與服務器端配合,可以實現斷點續傳等諸多功能
21 * 本例主要是研究FireFox的file-input節點的一些特性
22 * 其他客戶端應用,如Flash、Sliverlight等,在實現客戶端大文件上傳時
23 * 在數據傳輸與服務器端存儲等方面,與本例的思路基本一致
24 * 注意:文件體積似乎有個臨界點,但這個臨界點是多少尚未確認。建議不要用此方法上傳超過100M的文件。
25 * *********************************************************************************
26 */
27  function FireFoxFileSender(config){
28 var conf = config || {};
29 /*
30 * 錯誤信息隊列
31 */
32 this.errMsg = [];
33 /*
34 * 判斷各參數是否齊備
35 */
36 this.f = typeof conf.file == 'string' ? document.getElementById(conf.file) : conf.file;
37 if(!this.f){ this.errMsg.push('Error: Not set the input file.'); }
38 else if(this.f.files.length < 1){ this.errMsg.push('Error: Not select a file.'); }
39 else {
40 this.fileName = this.f.value;
41 /*
42 * 在嘗試直接發送二進制流時失敗,改用發送base64編碼數據。
43 */
44 this.data = (this.data = this.f.files[0].getAsDataURL()).substr(this.data.indexOf(',') + 1);
45 this.length = this.data.length;
46 /*
47 * 文件實際大小
48 */
49 this.fileSize = this.f.files[0].fileSize;
50 /*
51 * 文件類型
52 */
53 this.contentType = this.f.files[0].fileType;
54 }
55 /*
56 * 服務器端接收地址
57 */
58 this.url = conf.url;
59 if(!this.url){ this.errMsg.push('Error: Not set the instance url to send binary.'); }
60 /*
61 * 發送數據包的大小。默認100kb
62 */
63 this.packageSize = conf.packageSize || 102400;
64 /*
65 * 每次發送數據包大小應為4的倍數,確保服務器端轉換base64編碼正確。
66 */
67 if(this.packageSize % 4 != 0) this.packageSize = parseInt(this.packageSize / 4) * 4;
68
69 this.onSendFinished = conf.onSendFinished || null;
70 this.onSending = conf.onSending || null;
71 this.onError = conf.onError || null;
72 }
73 FireFoxFileSender.prototype = {
74 /*
75 * 記錄當前發送的數據
76 */
77 currentData : null,
78 /*
79 * 記錄讀取位置
80 */
81 position : 0,
82 /*
83 * 數據大小。該值為base64字符串的長度。
84 */
85 length : -1,
86 /*
87 * 檢查錯誤隊列,嘗試觸發onError事件
88 */
89 checkError : function(){
90 if(this.errMsg.length > 0){
91 /*
92 * 觸發onError事件
93 */
94 typeof this.onError == 'function' && this.onError(this.errMsg);
95 return;
96 }
97 },
98 /*
99 * 創建XMLHttpRequest
100 */
101 createSender : function(){
102 var xhr = new XMLHttpRequest();
103 xhr.open('POST', this.url, true);
104 var _ = this;
105 xhr.onreadystatechange = function(){
106 /*
107 * 當服務器段響應正常,則循環讀取發送。
108 */
109 if(xhr.readyState == 4 && xhr.status == 200){
110 /*
111 * 觸發onSending事件
112 */
113 if(typeof _.onSending == 'function') _.onSending(_, xhr);
114 /*
115 * 延時發送下一次請求,否則服務器負擔過重
116 */
117 var send = setTimeout(function(){
118 _.send();
119 clearTimeout(send);
120 send = null;
121 }, 100);
122 }
123 }
124 return xhr;
125 },
126 /*
127 * 發送數據
128 */
129 send : function(){
130 this.checkError();
131 /*
132 * 獲取當前要發送的數據
133 */
134 this.currentData = this.data.substr(this.position, this.packageSize);
135 /*
136 * 更改postion,模擬數據流移位
137 */
138 this.position += this.currentData.length;
139 /*
140 * 如果讀取字符串長度大于0,則發送該數據
141 * 否則觸發onSendFinished事件
142 */
143 if(this.currentData.length > 0) {
144 var xhr = this.createSender();
145 /*
146 * 自定義頭部信息,通知服務器端文件相關信息
147 * 實際應用時可修改此部分。
148 */
149 xhr.setRequestHeader('#FILE_NAME#', this.fileName);
150 xhr.setRequestHeader('#FILE_SIZE#', this.length);
151 xhr.setRequestHeader('#CONTENT_TYPE#', this.contentType);
152
153 xhr.send(this.currentData);
154 } else if(typeof this.onSendFinished == 'function') {
155 /*
156 * 觸發onSendFinished事件
157 */
158 this.onSendFinished(this);
159 }
160 },
161 /*
162 * 計算已發送數據百分比
163 */
164 percent : function(){
165 if(this.length <= 0 ) return -1;
166 return Math.round((this.position / this.length) * 10000) / 100;
167 },
168 onSendFinished : null, //該事件是以本地數據發送完成為觸發,并不是服務器端返回的完成信息。
169   onSending : null,
170 onError : null
171 }
172
173  /*
174 * 上傳按鈕事件
175 */
176  function%3

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色悠悠久久久久| 日韩精品免费在线| 日韩中文字幕第一页| 亚洲欧美激情四射在线日| 午夜免费在线观看精品视频| 久久久精品一区| 日韩欧美一区二区在线| 国产成人精品视频在线| 91大神福利视频在线| 欧美黄色片在线观看| 成人久久一区二区| 97精品久久久| 高清欧美一区二区三区| 国产精品一香蕉国产线看观看| 久久免费成人精品视频| 亚洲人成在线免费观看| 欧美午夜精品久久久久久久| 日韩一区av在线| 欧美国产日本在线| 久久精品色欧美aⅴ一区二区| 国产一区二区三区在线播放免费观看| 国产主播精品在线| 欧美成人一二三| 国产精品久久久久久中文字| 91久久中文字幕| 国产精品视频男人的天堂| 国内精品400部情侣激情| 日韩精品视频免费专区在线播放| 日韩欧美a级成人黄色| 精品国产精品自拍| 欧美成人午夜剧场免费观看| 欧美成人三级视频网站| 日本久久久a级免费| 欧美日韩成人在线观看| 亚洲欧美日韩中文在线制服| 亚洲视频在线免费观看| 亚洲美女激情视频| 亚洲人成免费电影| 成人精品一区二区三区电影黑人| 亚洲精品电影网| 中文字幕日韩欧美在线视频| 黑人巨大精品欧美一区二区一视频| 欧美极品少妇全裸体| 日本久久中文字幕| 中文字幕免费精品一区高清| 久久影院模特热| 精品毛片三在线观看| 久久国产精品网站| 精品国产一区二区三区久久狼5月| 亚洲国语精品自产拍在线观看| 亚洲精品一区久久久久久| 中文字幕日韩欧美精品在线观看| 亚洲国产欧美日韩精品| 91视频-88av| 国内精久久久久久久久久人| 成人h片在线播放免费网站| 精品久久久久久久中文字幕| 亚洲高清在线观看| 日韩中文字幕在线看| 亚洲国产日韩欧美在线图片| 欧美黑人性猛交| 欧美亚州一区二区三区| 亚洲自拍偷拍视频| 国产精品入口免费视| 91精品国产高清| 欧美一性一乱一交一视频| 久久中文字幕在线| 久久97久久97精品免视看| 青青草国产精品一区二区| 国产欧美日韩91| 日韩欧中文字幕| 91精品久久久久久久| 国产v综合v亚洲欧美久久| 色婷婷av一区二区三区在线观看| 国产精品日韩专区| 国产成人拍精品视频午夜网站| 午夜伦理精品一区| 激情亚洲一区二区三区四区| 久久伊人精品天天| 国产999精品久久久| 国产精品久久久久久影视| 亚洲新中文字幕| 日韩精品在线视频| 亚洲激情在线观看| 国产亚洲人成a一在线v站| 国产97人人超碰caoprom| 尤物精品国产第一福利三区| 亚洲精品欧美一区二区三区| 国产精品成人一区二区三区吃奶| 97免费视频在线| 欧美精品videofree1080p| 亚洲人成电影在线播放| 国产69精品久久久久9999| 78色国产精品| 亚洲欧洲日产国码av系列天堂| 精品久久久久久久久久久久| 91精品视频在线播放| 精品国产电影一区| 久久亚洲欧美日韩精品专区| 中文字幕欧美国内| 国内精品久久久久久久久| 国产精品久久久久久久久借妻| 国产精品久久久久久久电影| 欧美黑人巨大精品一区二区| 国产精品第二页| 欧美极品少妇xxxxⅹ喷水| 亚洲性线免费观看视频成熟| 欧美在线不卡区| 久久人人爽人人爽人人片av高请| 国内揄拍国内精品少妇国语| 日韩av有码在线| 国产亚洲精品久久久久久牛牛| 国产日韩欧美综合| 日韩在线观看免费网站| 国产999在线观看| 亚洲福利视频专区| 国产成人精品久久亚洲高清不卡| 色综合影院在线| 日韩欧美成人精品| 亚洲色图综合网| 欧美中文在线视频| 3344国产精品免费看| 欧美高清无遮挡| 亚洲国产小视频在线观看| 亚洲日本aⅴ片在线观看香蕉| 欧美最顶级丰满的aⅴ艳星| 欧美视频一区二区三区…| 国产精品video| 日韩欧美精品免费在线| 国产高清视频一区三区| 亚洲人午夜精品免费| 欧美尺度大的性做爰视频| 国产欧美日韩91| 97在线视频一区| 精品呦交小u女在线| 国产精品爱久久久久久久| 一个色综合导航| 国产福利精品av综合导导航| 97激碰免费视频| 精品久久久久久久久久| 日韩亚洲欧美中文高清在线| 久久久久久久久久久国产| 亚洲综合精品伊人久久| 国产精品99久久久久久久久久久久| 91精品综合久久久久久五月天| 日韩福利视频在线观看| 韩剧1988免费观看全集| 国产精品中文字幕久久久| 国产成人精品免费久久久久| 久久国产精品久久久久| 精品人伦一区二区三区蜜桃免费| 亚洲人午夜精品免费| 欧美国产激情18| 亚洲精品成人免费| 88国产精品欧美一区二区三区| 亚洲第一黄色网| 国产精品www网站| 国产精品中文在线| 国产精品第8页| 日韩精品在线观看网站| 成人精品在线观看| 国产精品成人免费电影| 性色av一区二区三区| 久久精品中文字幕免费mv|