<?php
define('UPU_CLIENT_CHARSET', 'utf-8');
define('UPU_TEMP_PATH', '/upload/upu/temp/');
define('UPU_SAVE_PATH', '/upload/upu/files/');
define('UPU_SOCKET_ENDTAG', "x2dx2dx0dx0a");
define('UPU_CRLF', "x0dx0a");
define('UPU_SOCKET_CREATE_ERROR', "Socket创建失败");
define('UPU_SOCKET_BIND_ERROR', "端口绑定失败");
define('UPU_SOCKET_LISTEN_ERROR', "端口监听失败");
define('UPU_SOKET_ACCEPT_ERROR', "无法接受客户端请求");
define('UPU_CREATE_TEMP_FILE_ERROR', "创建临时文件失败");
define('UPU_FILE_TO_LARGE', "文件超过指定大小");
define('UPU_GET_TMP_FILE_SIZE_ERROR', "获取临时文件大小失败");
define('UPU_READ_TMP_FILE_ERROR', "打开临时文件失败");
define('UPU_WRITE_NEW_FILE_ERRPR', "创建新文件失败");
class UPU
{
var $sPort = 1024;
var $ePort = 65536;
var $savePath = UPU_SAVE_PATH;
var $tmpPath = UPU_TEMP_PATH;
var $allowExt = "*";
var $maxFileSize = 0;
var $srvPort;
var $ipAddr;
var $processID;
var $bufferSize = 1024;
var $Boundary;
var $ContentLength = 0;
var $fileSize = 0;
var $fileInfo = array();
var $formData = array();
var $errorCode = 0;
function UPU ()
{
$this->srvPort = mt_rand($this->sPort, $this->ePort);
$this->ipAddr = $_SERVER['SERVER_NAME'];
}
function processRequest()
{
$uSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($uSocket < 0) return -101;
$uBind = socket_bind($uSocket, $this->ipAddr, $this->srvPort);
if ($uBind < 0) return -102;
//socket_set_blocking($uSocket);
$uListen = socket_listen($uSocket, 5);
if ($uListen < 0) return -103;
$this->writeContents($this->tmpPath . $this->processID . ".srv", $this->ipAddr.":".$this->srvPort);
$uRequest = socket_accept($uSocket);
if ($uRequest < 0) return -104;
$httpResponse = "HTTP/1.1 200 OKrn";
$httpResponse .= "Content-Length: 2rn";
$httpResponse .= "Content-Type: text/htmlrn";
$httpResponse .= "Last-Modified: " . date("r") . "rn";
$httpResponse .= "Accept-Ranges: bytesrn";
$httpResponse .= "X-Powered-By: UPUrn";
$httpResponse .= "Date: " . date("r") . "rnrn";
socket_write($uRequest, $httpResponse);
$neededbuffer = true;
$BufferPond = array();
$tmpFileName = $this->tmpPath . $this->processID . ".dat";
if(!$fp = fopen ($tmpFileName, "wb")) return -105;
$dataRead = 0;
while ($flag = socket_recv($uRequest, $buffer, $this->bufferSize, 0))
{
fwrite($fp, $buffer);
// buffer pond
array_push ($BufferPond, $buffer);
if (count($BufferPond) == 3)
{
$dataRead += strlen($BufferPond[0]);
array_shift($BufferPond);
}
$Contents = join("", $BufferPond);
// boundary
if (!$this->Boundary)
{
if (preg_match("/Content-Type: multipart/form-data; boundary=[-]{27}(S+)/i", $Contents, $matchesB))
$this->Boundary = $matchesB[1];
}
// content length
if (!$this->ContentLength)
{
if (preg_match("/Content-Length: (d+)rn/i", $Contents, $matchesL))
{
$this->ContentLength = $matchesL[1];
$this->writeContents($this->tmpPath . $this->processID . ".con", $this->ContentLength);
if ($this->maxFileSize && $this->ContentLength > $$maxFileSize * 1024 * 1024)
{
return -106;
break;
}
}
}
// parse
$boundary = str_repeat("-", 29) . $this->Boundary;
if (strpos($Contents, $boundary))
{
preg_match_all("/$boundaryrnContent-Disposition:form-data; name=/"([^/"]*)/"(; filename=/"([^/"]*)/"rnContent-Type:(S+))?rn/i", $Contents, $matchesF, PREG_OFFSET_CAPTURE);
//print_r($matchesF);
if ($matchesF)
{
for ($i = 0; $i < count($matchesF[0]); $i ++)
{
$formIndex = $this->checkFormName($matchesF[1][$i][0], $this->formData);
if ( $formIndex === -1)
{
$this->formData[] = array (
'name' => $matchesF[1][$i][0],
'type' => $matchesF[3][$i] ? "file" : "form",
'filename' => $matchesF[3][$i][0],
'content-type' => $matchesF[4][$i][0],
'offset' => $dataRead + $matchesF[0][$i][1],
'full' => $matchesF[0][$i][0]
);
if ($matchesF[3][$i])
{
$clientArray = "new Array(/"" .$matchesF[1][$i][0] . "/",/"" .$this->getBaseName($matchesF[3][$i][0]) . "/",/"" .$matchesF[4][$i][0] . "/")";
$this->writeContents($this->tmpPath . $this->processID . ".inf", $clientArray);
}
}
}
}
else
{
break;
}
}
if ($flag < 0)
{
echo socket_strerror(socket_last_error($uSocket));
break;
}
elseif ($flag == 0)
{
echo "client disconnected";
break;
}
// end of request ?
$eof = substr($buffer, -4);
$las = substr($buffer, $this->bufferSize - 4, 4);
if ($eof == UPU_SOCKET_ENDTAG || (strlen($eof) < 4&& ($las{strlen($eof) -1} == "x0a" || $las{strlen($eof) -1} =="x00")))
{
break;
}
$loopTime ++;
}
fclose($fp);
$msg = "ok";
socket_write($uRequest, $msg, strlen($msg));
socket_close($uRequest);
socket_close($uSocket);
//print_r($this->fileInfo);
//print_r($this->formData);
// temp file size
下面还有一半是链着的,,一个帖子好像发不了这么多字,建议站长把字符加长一点