3 * FileIO Satellite 衛星計畫後端
\r
5 * 搭配 satellite.php/pl 利用遠端空間管理圖檔
\r
7 * @package PMCLibrary
\r
8 * @version $Id: fileio.satellite.php 636 2008-05-19 07:54:19Z scribe $
\r
9 * @date $Date: 2008-05-19 15:54:19 +0800 (星期一, 19 五月 2008) $
\r
13 var $userAgent, $parameter, $thumbLocalPath;
\r
16 /* private 測試連線並且初始化遠端衛星主機 */
\r
17 function _initSatellite(){
\r
18 if(!($fp = @fsockopen($this->parameter[0]['host'], 80))) return false;
\r
20 $argument = 'mode=init&key='.$this->parameter[2];
\r
21 $out = 'POST '.$this->parameter[0]['path']." HTTP/1.1\r\n";
\r
22 $out .= 'Host: '.$this->parameter[0]['host']."\r\n";
\r
23 $out .= 'User-Agent: '.$this->userAgent."\r\n";
\r
24 $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
\r
25 $out .= 'Content-Length: '.strlen($argument)."\r\n\r\n";
\r
28 $result = fgets($fp, 128); // 取一次足以取到檔頭
\r
31 return (strpos($result, '202 Accepted')!==false ? true : false); // 檢查狀態值偵測是否傳輸成功
\r
34 /* private 傳送抓取要求到遠端衛星主機上面 */
\r
35 function _transloadSatellite($imgname){
\r
36 if(!($fp = @fsockopen($this->parameter[0]['host'], 80))) return false;
\r
38 $argument = 'mode=transload&key='.$this->parameter[2].'&imgurl='.$this->getImageLocalURL($imgname).'&imgname='.$imgname;
\r
39 $out = 'POST '.$this->parameter[0]['path']." HTTP/1.1\r\n";
\r
40 $out .= 'Host: '.$this->parameter[0]['host']."\r\n";
\r
41 $out .= 'User-Agent: '.$this->userAgent."\r\n";
\r
42 $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
\r
43 $out .= 'Content-Length: '.strlen($argument)."\r\n\r\n";
\r
46 $result = fgets($fp, 128); // 取一次足以取到檔頭
\r
49 return (strpos($result, '202 Accepted')!==false ? true : false); // 檢查狀態值偵測是否傳輸成功
\r
52 /* private 直接傳送檔案到遠端衛星主機上面 */
\r
53 function _uploadSatellite($imgname, $imgpath){
\r
54 srand((double) microtime()*1000000);
\r
55 $boundary = '---------------------'.substr(md5(rand(0,32000)), 0, 10); // 生成分隔線
\r
57 $argument = ''; // 資料暫存
\r
59 $formField = array('mode' => 'upload', 'key' => $this->parameter[2], 'imgname' => $imgname);
\r
60 foreach($formField as $ikey => $ival){
\r
61 $argument .= "--$boundary\r\n";
\r
62 $argument .= "Content-Disposition: form-data; name=\"".$ikey."\"\r\n\r\n";
\r
63 $argument .= $ival."\r\n";
\r
64 $argument .= "--$boundary\r\n";
\r
67 $imginfo = getimagesize($imgpath); // 取得圖檔資訊
\r
68 $argument .= "--$boundary\r\n";
\r
69 $argument .= 'Content-Disposition: form-data; name="imgfile"; filename="'.$imgname.'"'."\r\n";
\r
70 $argument .= 'Content-Type: '.$imginfo['mime']."\r\n\r\n";
\r
71 $argument .= join('', file($imgpath))."\r\n";
\r
72 $argument .= "--$boundary--\r\n";
\r
74 $out = 'POST '.$this->parameter[0]['path']." HTTP/1.1\r\n";
\r
75 $out .= 'Host: '.$this->parameter[0]['host']."\r\n";
\r
76 $out .= 'User-Agent: '.$this->userAgent."\r\n";
\r
77 $out .= "Content-Type: multipart/form-data, boundary=$boundary\r\n";
\r
78 $out .= 'Content-Length: '.strlen($argument)."\r\n\r\n";
\r
81 if(!($fp = @fsockopen($this->parameter[0]['host'], 80))) return false;
\r
83 $result = fgets($fp, 128);
\r
86 return (strpos($result, '202 Accepted')!==false ? true : false);
\r
89 /* private 發出刪除圖片要求 */
\r
90 function _deleteSatellite($imgname){
\r
91 if(!($fp = @fsockopen($this->parameter[0]['host'], 80))) return false;
\r
93 $argument = 'mode=delete&key='.$this->parameter[2].'&imgname='.$imgname;
\r
94 $out = 'POST '.$this->parameter[0]['path']." HTTP/1.1\r\n";
\r
95 $out .= 'Host: '.$this->parameter[0]['host']."\r\n";
\r
96 $out .= 'User-Agent: '.$this->userAgent."\r\n";
\r
97 $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
\r
98 $out .= 'Content-Length: '.strlen($argument)."\r\n\r\n";
\r
101 $result = fgets($fp, 128);
\r
104 return (strpos($result, '202 Accepted')!==false ? true : false);
\r
107 /* private 儲存索引檔 */
\r
108 function _setIndex(){
\r
109 $this->IFS->saveIndex(); // 索引表更新
\r
112 function FileIO($parameter, $ENV){
\r
113 require($ENV['IFS.PATH']);
\r
114 $this->IFS = new IndexFS($ENV['IFS.LOG']); // IndexFS 物件
\r
115 $this->IFS->openIndex();
\r
116 register_shutdown_function(array($this, '_setIndex')); // 設定解構元 (PHP 結束前執行)
\r
117 set_time_limit(120); // 執行時間 120 秒 (傳輸過程可能很長)
\r
118 $this->userAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'; // Just for fun ;-)
\r
119 $this->thumbLocalPath = $ENV['PATH'].$ENV['THUMB']; // 預覽圖本機位置
\r
120 $this->parameter = $parameter; // 將參數重新解析
\r
121 $this->parameter[0] = parse_url($this->parameter[0]); // URL 位置拆解
\r
123 [0] : 衛星程式遠端 URL 位置
\r
124 [1] : 是否使用 Transload 方式要求衛星程式抓取圖檔 (true:是 false:否,使用傳統 HTTP 上傳)
\r
127 [4] : 預覽圖是否上傳至遠端 (true: 是, false: 否,使用本機檔案)
\r
132 return $this->_initSatellite();
\r
135 function imageExists($imgname){
\r
136 if(!$this->parameter[4] && substr($imgname, -5) == 's.jpg') return file_exists($this->thumbLocalPath.$imgname);
\r
137 return $this->IFS->beRecord($imgname);
\r
140 function deleteImage($imgname){
\r
141 if(is_array($imgname)){
\r
142 foreach($imgname as $i){
\r
143 if(!$this->parameter[4] && substr($i, -5) == 's.jpg'){
\r
144 @unlink($this->thumbLocalPath.$i);
\r
146 if(!$this->_deleteSatellite($i)) return false;
\r
147 $this->IFS->delRecord($i); // 自索引中刪除
\r
154 if(!$this->parameter[4] && substr($imgname, -5) == 's.jpg') return @unlink($this->thumbLocalPath.$imgname);
\r
155 if($result = $this->_deleteSatellite($imgname)) $this->IFS->delRecord($imgname);
\r
160 function uploadImage($imgname='', $imgpath='', $imgsize=0){
\r
161 if($imgname=='') return true; // 支援上傳方法
\r
162 if(!$this->parameter[4] && substr($imgname, -5) == 's.jpg') return false; // 不處理預覽圖
\r
163 $result = $this->parameter[1] ? $this->_transloadSatellite($imgname) : $this->_uploadSatellite($imgname, $imgpath); // 選擇傳輸方法
\r
165 $this->IFS->addRecord($imgname, $imgsize, ''); // 加入索引之中
\r
166 unlink($imgpath); // 確實上傳後刪除本機暫存
\r
171 function getImageFilesize($imgname){
\r
172 if(!$this->parameter[4] && substr($imgname, -5) == 's.jpg') return @filesize($this->thumbLocalPath.$imgname);
\r
173 if($rc = $this->IFS->getRecord($imgname)) return $rc['imgSize'];
\r
177 function getImageURL($imgname){
\r
178 if(!$this->parameter[4] && substr($imgname, -5) == 's.jpg') return $this->getImageLocalURL($imgname);
\r
179 return $this->IFS->beRecord($imgname) ? $this->parameter[3].$imgname : false;
\r