/** * Function always use provided $filename. In cases when it's empty, for string content or when name cannot be * automatically discovered the $filename will be set to attachment name. * If attachment name is not provided, it will be randomly generated. * @param resource|string|StreamInterface $content StreamInterface/resource/string to send * @param string $filename Optional. Filename of attachment, can't be empty if content is string * @param array $headers Optional. Associative array of custom headers * @param string $name Optional. Form field name * @return $this */ public function addAttachment($content, $filename = '', array $headers = array(), $name = '') { $uri = null; if (!empty($filename)) { $uri = $filename; } elseif ($content instanceof StreamInterface) { $meta = $content->getMetadata('uri'); if (substr($meta, 0, 6) !== 'php://') { $uri = $meta; } } elseif (is_resource($content)) { $meta = stream_get_meta_data($content); $uri = $meta['uri']; } $basename = basename($uri); if (empty($basename)) { throw new \InvalidArgumentException('File name was not provided and cannot be auto-discovered'); } $name = !empty($name) ? $name : $basename; $element = array('contents' => $content, 'name' => $name); // always set as defined or else it will be auto-discovered by Guzzle if (!empty($filename)) { $element['filename'] = $filename; } if (!empty($headers)) { $element['headers'] = $headers; } $contentKey = null; foreach ($headers as $k => $v) { if (strtolower($k) == 'content-type') { $contentKey = $k; } } if (empty($contentKey)) { if (is_string($content)) { // Automatically set $element['headers']['Content-Type'] = 'application/octet-stream'; } elseif ($content instanceof StreamInterface) { $type = \GuzzleHttp\Psr7\mimetype_from_filename($basename); if (!$type) { throw new \InvalidArgumentException('Content-Type header was not provided and cannot be auto-discovered'); } } } $this->elements[] = $element; return $this; }
<?php // Files override to enable hosting secure docs Route::get('uploads/{file_path}', ['middleware' => ['web', 'auth'], function ($file_path) { $file_full_path = storage_path() . '/uploads/' . $file_path; if (file_exists($file_full_path)) { $size = filesize($file_full_path); $type = \GuzzleHttp\Psr7\mimetype_from_filename($file_path); return response()->download($file_full_path, null, ['size' => $size, 'Content-Type' => $type], null); } else { return response('upload not found', 404); } }])->where('file_path', '.*'); // catch all (rest must be cms pages) Route::any('{other}', ['middleware' => ['web'], 'uses' => 'CoasterCms\\Http\\Controllers\\CmsController@generatePage'])->where('other', '.*');
/** * Generate object headers. * * @param BucketInterface $bucket * @param string $name * @param mixed $source * @return array */ private function createHeaders(BucketInterface $bucket, $name, $source) { if (empty($mimetype = \GuzzleHttp\Psr7\mimetype_from_filename($name))) { $mimetype = self::DEFAULT_MIMETYPE; } $headers = $bucket->getOption('headers', []); if (!empty($maxAge = $bucket->getOption('maxAge', 0))) { //Shortcut $headers['Cache-control'] = 'max-age=' . $bucket->getOption('maxAge', 0) . ', public'; $headers['Expires'] = gmdate('D, d M Y H:i:s T', time() + $bucket->getOption('maxAge', 0)); } return $headers + ['Content-MD5' => base64_encode(md5_file($this->castFilename($source), true)), 'Content-Type' => $mimetype]; }
public function prepare(reactRequest $request, reactResponse $response, $output) { static $serverSoftware, $settings; if ($serverSoftware === null) { $serverSoftware = 'MPCMF Async PHP ' . phpversion(); $settings = ['document_root' => APP_ROOT . '/htdocs']; } $_SERVER = []; $now = microtime(true); $_SERVER['REQUEST_TIME'] = (int) $now; $_SERVER['REQUEST_TIME_FLOAT'] = $now; $GLOBALS['MPCMF_START_TIME'] = $now; /** @var Uri $requestUrl */ $requestUrl = $request->getUrl(); $path = $requestUrl->getPath(); if ($path === '/favicon.ico') { $response->writeHead(404); $response->end('FAVICON NOT FOUND! :)'); //MPCMF_DEBUG && $output->writeln("<info>[CHILD:{$this->port}]</info> Connection closed by favicon catch"); return false; } $realpath = realpath($settings['document_root'] . $path); if ($realpath !== false && strpos($realpath, $settings['document_root']) !== false && (file_exists($realpath) && !is_dir($realpath))) { $response->writeHead(200, ['Content-type' => \GuzzleHttp\Psr7\mimetype_from_filename($realpath), 'Content-length' => filesize($realpath)]); $response->end(file_get_contents($realpath)); //MPCMF_DEBUG && $output->writeln("<info>[CHILD:{$this->port}]</info> Connection closed by static"); return false; } $_FILES = []; foreach ($request->getFiles() as $filename => $fileData) { $tmpname = tempnam('/tmp/mpcmf/', 'upl'); file_put_contents($tmpname, stream_get_contents($fileData['stream'])); $_FILES[$filename] = ['name' => $filename, 'type' => $fileData['type'], 'tmp_name' => $tmpname, 'error' => $fileData['error'], 'size' => $fileData['size']]; } $_SERVER['DOCUMENT_ROOT'] = $settings['document_root']; $_SERVER['REMOTE_ADDR'] = $request->getRemoteAddress(); $_SERVER['REMOTE_PORT'] = 0; $_SERVER['SERVER_SOFTWARE'] = $serverSoftware; $_SERVER['SERVER_PROTOCOL'] = "HTTP/{$request->getHttpVersion()}"; $_SERVER['SERVER_NAME'] = $this->childHost; $_SERVER['SERVER_PORT'] = $this->port; $path = $requestUrl->getPath(); $queryString = $requestUrl->getQuery(); $_SERVER['REQUEST_URI'] = $path . (!empty($queryString) ? "?{$queryString}" : ''); $_SERVER['REQUEST_METHOD'] = mb_strtoupper($request->getMethod()); $_SERVER['SCRIPT_NAME'] = '/'; $_SERVER['SCRIPT_FILENAME'] = __FILE__; $_SERVER['PATH_INFO'] = $path; $_SERVER['PHP_SELF'] = $path; $headers = $request->getHeaders(); foreach ($headers as $headerKey => $headerValue) { $_SERVER['HTTP_' . strtoupper(preg_replace('/[\\-\\s]/', '_', $headerKey))] = $headerValue; } if (isset($_SERVER['HTTP_X_REAL_IP'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_REAL_IP']; } $_SERVER['QUERY_STRING'] = $queryString; //@todo remove on pull request merge https://github.com/reactphp/http/pull/34 $_GET = $request->getQuery(); $_POST = $request->getPost(); parse_str($queryString, $parsedGET); parse_str($request->getBody(), $parsedPOST); $_GET = array_replace($_GET, $parsedGET); $_POST = array_replace($_POST, $parsedPOST); if (isset($_SERVER['HTTP_COOKIE'])) { parse_str($_SERVER['HTTP_COOKIE'], $_COOKIE); } else { $_COOKIE = []; } $_REQUEST = array_merge($_GET, $_POST); return true; }
/** * {@inheritdoc} */ public function put(BucketInterface $bucket, $name, $source) { if (empty($mimetype = \GuzzleHttp\Psr7\mimetype_from_filename($name))) { $mimetype = self::DEFAULT_MIMETYPE; } try { $request = $this->buildRequest('PUT', $bucket, $name, ['Content-Type' => $mimetype, 'Etag' => md5_file($this->castFilename($source))]); $this->client->send($request->withBody($this->castStream($source))); } catch (ClientException $exception) { if ($exception->getCode() == 401) { $this->reconnect(); return $this->put($bucket, $name, $source); } //Some unexpected error throw new ServerException($exception->getMessage(), $exception->getCode(), $exception); } return true; }
public function saveFile($filename) { $file = $this->mediaHelper->collectFileInfo($this->getMediaBaseDirectory(), $filename); try { $this->client->putObject(['ACL' => 'public-read', 'Body' => $file['content'], 'Bucket' => $this->getBucket(), 'ContentType' => \GuzzleHttp\Psr7\mimetype_from_filename($file['filename']), 'Key' => $filename]); } catch (\Exception $e) { } return $this; }
/** * Get mimetype of the file * * @return string */ public function getMimetype() { return \GuzzleHttp\Psr7\mimetype_from_filename($this->path) ?: 'text/plain'; }