diff --git a/src/aphront/multipartparser/AphrontMultipartPart.php b/src/aphront/multipartparser/AphrontMultipartPart.php index 28daa28..04e79e9 100644 --- a/src/aphront/multipartparser/AphrontMultipartPart.php +++ b/src/aphront/multipartparser/AphrontMultipartPart.php @@ -1,66 +1,96 @@ parseRawHeader($bytes); $header_name = $parser->getHeaderName(); $this->headers[] = array( $header_name, $parser->getHeaderContent(), ); if (strtolower($header_name) === 'content-disposition') { $pairs = $parser->getHeaderContentAsPairs(); foreach ($pairs as $pair) { list($key, $value) = $pair; switch ($key) { case 'filename': $this->filename = $value; break; case 'name': $this->name = $value; break; } } } return $this; } public function appendData($bytes) { + $this->byteSize += strlen($bytes); + if ($this->isVariable()) { $this->value .= $bytes; } else { - throw new Exception(pht('File multipart stuff is not yet supported.')); + if (!$this->tempFile) { + $this->tempFile = new TempFile(getmypid().'.upload'); + } + Filesystem::appendFile($this->tempFile, $bytes); } return $this; } public function isVariable() { return ($this->filename === null); } public function getName() { return $this->name; } public function getVariableValue() { if (!$this->isVariable()) { throw new Exception(pht('This part is not a variable!')); } return $this->value; } + public function getPHPFileDictionary() { + if (!$this->tempFile) { + $this->appendData(''); + } + + $mime_type = 'application/octet-stream'; + foreach ($this->headers as $header) { + list($name, $value) = $header; + if (strtolower($name) == 'content-type') { + $mime_type = $value; + break; + } + } + + return array( + 'name' => $this->filename, + 'type' => $mime_type, + 'tmp_name' => (string)$this->tempFile, + 'error' => 0, + 'size' => $this->byteSize, + ); + } + }