[ Index ]

PHP Cross Reference of phpBB-3.3.3-deutsch

title

Body

[close]

/vendor/guzzlehttp/psr7/src/ -> MultipartStream.php (source)

   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  }


Generated: Sun Feb 14 20:08:31 2021 Cross-referenced by PHPXref 0.7.1