]> 4ch.mooo.com Git - test.git/blob - lib/fileio/fileio.satellite.php
modified: config.php
[test.git] / lib / fileio / fileio.satellite.php
1 <?php\r
2 /**\r
3  * FileIO Satellite 衛星計畫後端\r
4  *\r
5  * 搭配 satellite.php/pl 利用遠端空間管理圖檔\r
6  *\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
10  */\r
11 \r
12 class FileIO{\r
13         var $userAgent, $parameter, $thumbLocalPath;\r
14         var $IFS;\r
15 \r
16         /* private 測試連線並且初始化遠端衛星主機 */\r
17         function _initSatellite(){\r
18                 if(!($fp = @fsockopen($this->parameter[0]['host'], 80))) return false;\r
19 \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
26                 $out .= $argument;\r
27                 fwrite($fp, $out);\r
28                 $result = fgets($fp, 128); // 取一次足以取到檔頭\r
29                 fclose($fp);\r
30 \r
31                 return (strpos($result, '202 Accepted')!==false ? true : false); // 檢查狀態值偵測是否傳輸成功\r
32         }\r
33 \r
34         /* private 傳送抓取要求到遠端衛星主機上面 */\r
35         function _transloadSatellite($imgname){\r
36                 if(!($fp = @fsockopen($this->parameter[0]['host'], 80))) return false;\r
37 \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
44                 $out .= $argument;\r
45                 fwrite($fp, $out);\r
46                 $result = fgets($fp, 128); // 取一次足以取到檔頭\r
47                 fclose($fp);\r
48 \r
49                 return (strpos($result, '202 Accepted')!==false ? true : false); // 檢查狀態值偵測是否傳輸成功\r
50         }\r
51 \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
56 \r
57                 $argument = ''; // 資料暫存\r
58                 // 一般欄位資料轉換\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
65                 }\r
66                 // 上傳檔案欄位資料轉換\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
73 \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
79                 $out .= $argument;\r
80 \r
81                 if(!($fp = @fsockopen($this->parameter[0]['host'], 80))) return false;\r
82                 fwrite($fp, $out);\r
83                 $result = fgets($fp, 128);\r
84                 fclose($fp);\r
85 \r
86                 return (strpos($result, '202 Accepted')!==false ? true : false);\r
87         }\r
88 \r
89         /* private 發出刪除圖片要求 */\r
90         function _deleteSatellite($imgname){\r
91                 if(!($fp = @fsockopen($this->parameter[0]['host'], 80))) return false;\r
92 \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
99                 $out .= $argument;\r
100                 fwrite($fp, $out);\r
101                 $result = fgets($fp, 128);\r
102                 fclose($fp);\r
103 \r
104                 return (strpos($result, '202 Accepted')!==false ? true : false);\r
105         }\r
106 \r
107         /* private 儲存索引檔 */\r
108         function _setIndex(){\r
109                 $this->IFS->saveIndex(); // 索引表更新\r
110         }\r
111 \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
122                 /*\r
123                         [0] : 衛星程式遠端 URL 位置\r
124                         [1] : 是否使用 Transload 方式要求衛星程式抓取圖檔 (true:是 false:否,使用傳統 HTTP 上傳)\r
125                         [2] : 傳輸認證金鑰\r
126                         [3] : 遠端目錄對應 URL\r
127                         [4] : 預覽圖是否上傳至遠端 (true: 是, false: 否,使用本機檔案)\r
128                 */\r
129         }\r
130 \r
131         function init(){\r
132                 return $this->_initSatellite();\r
133         }\r
134 \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
138         }\r
139 \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
145                                 }else{\r
146                                         if(!$this->_deleteSatellite($i)) return false;\r
147                                         $this->IFS->delRecord($i); // 自索引中刪除\r
148 \r
149                                 }\r
150                         }\r
151                         return true;\r
152                 }\r
153                 else{\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
156                         return $result;\r
157                 }\r
158         }\r
159 \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
164                 if($result){\r
165                         $this->IFS->addRecord($imgname, $imgsize, ''); // 加入索引之中\r
166                         unlink($imgpath); // 確實上傳後刪除本機暫存\r
167                 }\r
168                 return $result;\r
169         }\r
170 \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
174                 return false;\r
175         }\r
176 \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
180         }\r
181 }\r
182 ?>