/** * Save/Upload file with auto-dectection of file type * * @author Casper Rasmussen <*****@*****.**> * * @access public * @param mixed $file * @param string|null $folder * @param \Nodes\Assets\Upload\Settings|null $settings * @return null|string * @throws \Nodes\Assets\Upload\Exceptions\AssetsBadRequestException * @throws \Nodes\Assets\Upload\Exceptions\AssetsUploadFailedException */ public function add($file, $folder = null, UploadSettings $settings = null) { // Make sure we actually have data to work with if (empty($file)) { return null; } // Determine what kind of save/upload method // we should use to process this file if (filter_var($file, FILTER_VALIDATE_URL)) { return $this->addFromUrl($file, $folder, $settings); } elseif (is_string($file) && DataUri::isParsable($file)) { return $this->addFromDataUri($file, $folder, $settings); } else { if ($file instanceof UploadedFile) { return $this->addFromUploadedFile($file, $folder, $settings); } else { throw (new AssetsBadRequestException('Uploaded file/string type is not supported'))->setStatusCode(400); } } }
/** * addFromDataUri. * * @author Casper Rasmussen <*****@*****.**> * * @param string $dataUri * @param string $folder * @param \Nodes\Assets\Upload\Settings $settings * * @return string * @throws \Nodes\Assets\Upload\Exceptions\AssetsBadRequestException */ public function addFromDataUri($dataUri, $folder, Settings $settings) { // Data URI container $dataUriObject = null; // Try and parse data URI to our container if (!DataUri::tryParse($dataUri, $dataUriObject)) { throw (new AssetsBadRequestException('Could not stream the content'))->setStatusCode(400); } // Retrieve the data $content = $dataUriObject->getEncodedData(); // Write parsed content to temp. file $file = tempnam('/tmp', ''); file_put_contents($file, base64_decode($content)); // File's mime-type $mimeType = (new finfo(FILEINFO_MIME))->file($file); // Generate an UploadedFile object $uploadedFile = new UploadedFile($file, Str::random(10) . '.' . $dataUriObject->getFileExtension(), $mimeType, filesize($file)); // Set folder if (!$settings->hasFolder()) { $settings->setFolder($folder); } // Generate filename if (!$settings->hasFilename()) { $settings->setFileName($this->generateFilename($uploadedFile)); } // Generate file extension if (!$settings->hasFileExtension()) { $settings->setFileExtension($this->generateFileExtension($uploadedFile)); } // Throw exception if required data is missing $settings->checkRequiredData(); // Process file return $this->store($uploadedFile, $settings); }