[ Index ] |
PHP Cross Reference of phpBB-3.3.3-deutsch |
[Summary view] [Print] [Text view]
1 <?php 2 3 namespace GuzzleHttp\Psr7; 4 5 use Psr\Http\Message\StreamInterface; 6 7 /** 8 * Stream that when read returns bytes for a streaming multipart or 9 * multipart/form-data stream. 10 */ 11 class MultipartStream implements StreamInterface 12 { 13 use StreamDecoratorTrait; 14 15 private $boundary; 16 17 /** 18 * @param array $elements Array of associative arrays, each containing a 19 * required "name" key mapping to the form field, 20 * name, a required "contents" key mapping to a 21 * StreamInterface/resource/string, an optional 22 * "headers" associative array of custom headers, 23 * and an optional "filename" key mapping to a 24 * string to send as the filename in the part. 25 * @param string $boundary You can optionally provide a specific boundary 26 * 27 * @throws \InvalidArgumentException 28 */ 29 public function __construct(array $elements = [], $boundary = null) 30 { 31 $this->boundary = $boundary ?: sha1(uniqid('', true)); 32 $this->stream = $this->createStream($elements); 33 } 34 35 /** 36 * Get the boundary 37 * 38 * @return string 39 */ 40 public function getBoundary() 41 { 42 return $this->boundary; 43 } 44 45 public function isWritable() 46 { 47 return false; 48 } 49 50 /** 51 * Get the headers needed before transferring the content of a POST file 52 */ 53 private function getHeaders(array $headers) 54 { 55 $str = ''; 56 foreach ($headers as $key => $value) { 57 $str .= "{$key}: {$value}\r\n"; 58 } 59 60 return "--{$this->boundary}\r\n" . trim($str) . "\r\n\r\n"; 61 } 62 63 /** 64 * Create the aggregate stream that will be used to upload the POST data 65 */ 66 protected function createStream(array $elements) 67 { 68 $stream = new AppendStream(); 69 70 foreach ($elements as $element) { 71 $this->addElement($stream, $element); 72 } 73 74 // Add the trailing boundary with CRLF 75 $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n")); 76 77 return $stream; 78 } 79 80 private function addElement(AppendStream $stream, array $element) 81 { 82 foreach (['contents', 'name'] as $key) { 83 if (!array_key_exists($key, $element)) { 84 throw new \InvalidArgumentException("A '{$key}' key is required"); 85 } 86 } 87 88 $element['contents'] = Utils::streamFor($element['contents']); 89 90 if (empty($element['filename'])) { 91 $uri = $element['contents']->getMetadata('uri'); 92 if (substr($uri, 0, 6) !== 'php://') { 93 $element['filename'] = $uri; 94 } 95 } 96 97 list($body, $headers) = $this->createElement( 98 $element['name'], 99 $element['contents'], 100 isset($element['filename']) ? $element['filename'] : null, 101 isset($element['headers']) ? $element['headers'] : [] 102 ); 103 104 $stream->addStream(Utils::streamFor($this->getHeaders($headers))); 105 $stream->addStream($body); 106 $stream->addStream(Utils::streamFor("\r\n")); 107 } 108 109 /** 110 * @return array 111 */ 112 private function createElement($name, StreamInterface $stream, $filename, array $headers) 113 { 114 // Set a default content-disposition header if one was no provided 115 $disposition = $this->getHeader($headers, 'content-disposition'); 116 if (!$disposition) { 117 $headers['Content-Disposition'] = ($filename === '0' || $filename) 118 ? sprintf('form-data; name="%s"; filename="%s"', 119 $name, 120 basename($filename)) 121 : "form-data; name=\"{$name}\""; 122 } 123 124 // Set a default content-length header if one was no provided 125 $length = $this->getHeader($headers, 'content-length'); 126 if (!$length) { 127 if ($length = $stream->getSize()) { 128 $headers['Content-Length'] = (string) $length; 129 } 130 } 131 132 // Set a default Content-Type if one was not supplied 133 $type = $this->getHeader($headers, 'content-type'); 134 if (!$type && ($filename === '0' || $filename)) { 135 if ($type = MimeType::fromFilename($filename)) { 136 $headers['Content-Type'] = $type; 137 } 138 } 139 140 return [$stream, $headers]; 141 } 142 143 private function getHeader(array $headers, $key) 144 { 145 $lowercaseHeader = strtolower($key); 146 foreach ($headers as $k => $v) { 147 if (strtolower($k) === $lowercaseHeader) { 148 return $v; 149 } 150 } 151 152 return null; 153 } 154 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Feb 14 20:08:31 2021 | Cross-referenced by PHPXref 0.7.1 |