|
//==================================================== // FileName:IBPostFile.php // Summary: 實現HTTP協(xié)議的文件上傳 // Author: ice_berg16(尋夢的稻草人) // LastModifed:2005-3-30 // copyright(c)2005 ice_berg16@163.com // http://www. // // ------example------ // $pf = new IBPostFile( "http:///test.php"); // $pf->setFile( "uploadFile", "d:/images/ice.gif" ); // $pf->sendRequest(); // echo $pf->getResponse(); //====================================================
class IBPostFile { var $url; //要發(fā)送文件的URL var $formData; //發(fā)送的表單數據 var $fileData; //文件數據 var $boundary; //數據分隔標識 var $response; //保存服務器返回的信息 var $username; //需要身份驗證時的用戶名 var $pwd; //需要身份驗證時的密碼 var $port; //端口號
var $debug = true; //是否調試
/* 函數: IBPostFile ** 功能: Constructor ** 參數: $url String 要發(fā)送文件的URL */ function IBPostFile( $url="", $port="80") { $this->url = $url; $this->port = $port; $this->boundary = $this->createBoundary(); } /* 函數: sendRequest ** 功能: 發(fā)送請求并保存結果 */ function sendRequest() { $urlArray = parse_url( $this->url ); $fp = fsockopen( $urlArray[‘host‘], $this->port );
$requestData = $this->buildRequest();
//* fwrite( $fp, $requestData ); $content = ""; while( !feof( $fp ) ) { $content .= fread( $fp, 4096 ); } fclose( $fp ); //*/ $this->response = $content;
if( $this->debug ) { echo "---------HTTP-REQUEST-------"; echo "$requestData"; echo "---------HTTP-RESPONSE------"; echo "$content"; } //*/ }
/* 函數: getResponse() ** 功能: 返回服務器端的信息 */ function getResponse() { return $this->response; }
/* 函數: setForm( $formData ) ** 功能: 設置表單的字段值 ** 參數: $formData Array 字段名和值的數組 */ function setForm( $formData ) { $this->formData = $this->buildFormData( $formData ); }
/* 函數: setFile( $name, $filePath ) ** 功能: 設置要發(fā)送的文件 ** 參數: $name 文件名,即file域的name ** 參數: $filePath 要發(fā)送的文件路徑 */ function setFile( $name, $filePath ) {
$this->fileData = $this->buildFileData( $name, $filePath ); } /* 函數: setAuthor( $user, $pwd ) ** 功能: 設置身份驗證時需要的用戶名和密碼 ** 參數: $user 用戶名 ** 參數: $pwd 密碼 */ function setAuthor( $user, $pwd ) { $this->username = $user; $this->pwd = $pwd; }
/* 函數: buildRequest() ** 功能: 建立請求 */ function buildRequest() { $urlArray = parse_url( $this->url ); $request = array();
$request[] = "POST {$urlArray[‘path‘]} HTTP/1.0"; $request[] = "Host: {$urlArray[‘host‘]}"; $request[] = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"; $request[] = "Accept: */*"; $request[] = "Accept-Language: zh-cn"; $request[] = "Connection: Keep-Alive"; $request[] = "Cache-Control: no-cache"; //需要身份驗證 if ( !empty( $this->username ) && !empty( $this->pwd ) ) { $request[] = ‘Authorization: BASIC ‘ . base64_encode( $this->username.‘:‘.$this->pwd ); }
$request[] = "Content-Type: multipart/form-data; boundary={$this->boundary}"; $request[] = "Content-Length: " . $this->getDataLength() . "\r\n";
$requestString = join( "\r\n", $request ) . "\r\n" . $this->formData . "\r\n" . $this->fileData;
if( $this->debug ) { echo "----------- REQUEST_INFOMATION -----------"; echo "" . $requestString . ""; } return $requestString; }
/* 函數: getDataLength() ** 功能: 返回要發(fā)送數據的長度 */ function getDataLength() { return strlen( $this->formData ) + strlen("\r\n") + strlen( $this->fileData ); } /* 函數: buildFormData() ** 功能: 創(chuàng)建發(fā)送的數據格式 */ function buildFormData( $formData ) { $postData = array(); foreach( $formData as $k => $v ) { $row = array(); $row[] = "--{$this->boundary}"; $row[] = "Content-Disposition: form-data; name=\"$k\"\r\n"; $row[] = "$v";
$postData[] = join( "\r\n", $row ); }
return join( "\r\n", $postData ); } /* 函數: buildFileData( $name, $filePath ) ** 功能: 創(chuàng)建發(fā)送的文件格式 */ function buildFileData( $name, $filePath ) { //讀取文件信息 $fname = basename( $filePath ); $fp = fopen ( $filePath, "r" ); $data = fread ( $fp, filesize( $filePath ) ); fclose ($fp); $postData = array(); $postData[] = "--{$this->boundary}"; $postData[] = "Content-Disposition: form-data; name=\"$name\"; filename=\"$fname\"\r\n"; //$postData[] = "Content-Type: text/plain\r\n"; $postData[] = $data; $postData[] = "--{$this->boundary}--";
return join( "\r\n", $postData ); }
/* 函數: createBoundary() ** 功能: 創(chuàng)建數據分隔標識 */ function createBoundary() { return "---------------------------" . substr(md5(time()), -12 ); }
}
?>
|