/** * Parse a data URI and return a DataUri\Data * * @param string $dataUri A data URI * @return \DataUri\Data * @throws InvalidArgumentException * @throws InvalidData */ public static function parse($dataUri, $len = Data::TAGLEN, $strict = false) { $dataParams = $matches = array(); if (!preg_match(self::DATA_URI_REGEXP, $dataUri, $matches)) { throw new \InvalidArgumentException('Could not parse the URL scheme'); } $base64 = false; $mimeType = $matches[1]; $params = $matches[2]; $rawData = $matches[3]; if ("" !== $params) { foreach (explode(';', $params) as $param) { if (strstr($param, '=')) { $param = explode('=', $param); $dataParams[array_shift($param)] = array_pop($param); } elseif ($param === Data::BASE_64) { $base64 = true; } } } if ($base64 && !($rawData = base64_decode($rawData, $strict))) { throw new InvalidData('base64 encoding failed'); } if (!$base64) { $rawData = rawurldecode($rawData); } $dataURI = new Data($rawData, $mimeType, $dataParams, $strict, $len); $dataURI->setBinaryData($base64); return $dataURI; }
/** * Transform a DataURI\Data object to its URI representation and take * the following form : * * data:[<mediatype>][;base64],<data> * * @param Data $dataURI * @return string */ public static function dump(Data $dataURI) { $parameters = ''; if (0 !== count($params = $dataURI->getParameters())) { foreach ($params as $paramName => $paramValue) { $parameters .= sprintf(';%s=%s', $paramName, $paramValue); } } $base64 = $dataURI->isBinaryData() ? sprintf(';%s', Data::BASE_64) : ''; $data = $dataURI->isBinaryData() ? base64_encode($dataURI->getData()) : rawurlencode($dataURI->getData()); return sprintf('data:%s%s%s,%s', $dataURI->getMimeType(), $parameters, $base64, $data); }
/** * @covers Alchemy\Phrasea\Controller\Prod\Upload::upload * @covers Alchemy\Phrasea\Controller\Prod\Upload::getJsonResponse */ public function testUpload() { self::$DI['app']['notification.deliverer'] = $this->getMockBuilder('Alchemy\\Phrasea\\Notification\\Deliverer')->disableOriginalConstructor()->getMock(); $data = DataURI\Data::buildFromFile(__DIR__ . '/../../../../../files/cestlafete.jpg'); $params = ['base_id' => self::$DI['collection']->get_base_id(), 'b64_image' => DataURI\Dumper::dump($data)]; $files = ['files' => [new UploadedFile($this->tmpFile, 'KIKOO.JPG')]]; self::$DI['client']->request('POST', '/prod/upload/', $params, $files, ['HTTP_Accept' => 'application/json']); $response = self::$DI['client']->getResponse(); $this->checkJsonResponse($response); $datas = json_decode($response->getContent(), true); $this->assertTrue($datas['success']); if ($datas['element'] == 'record') { $id = explode('_', $datas['id']); $record = new \record_adapter(self::$DI['app'], $id[0], $id[1]); $this->assertTrue($record->get_thumbnail()->is_physically_present()); } }
/** * @covers Alchemy\Phrasea\Controller\Prod\Upload::upload * @covers Alchemy\Phrasea\Controller\Prod\Upload::getJsonResponse */ public function testUpload() { self::$DI['app']['notification.deliverer'] = $this->getMockBuilder('Alchemy\\Phrasea\\Notification\\Deliverer')->disableOriginalConstructor()->getMock(); $data = DataURI\Data::buildFromFile(__DIR__ . '/../../../../../files/cestlafete.jpg'); $params = ['base_id' => self::$DI['collection']->get_base_id(), 'b64_image' => DataURI\Dumper::dump($data)]; $files = ['files' => [new UploadedFile($this->tmpFile, 'KIKOO.JPG')]]; /** @var Client $client */ $client = self::$DI['client']; $client->request('POST', '/prod/upload/', $params, $files, ['HTTP_Accept' => 'application/json']); $response = $client->getResponse(); $this->checkJsonResponse($response); $datas = json_decode($response->getContent(), true); $this->assertTrue($datas['success']); $this->assertArrayHasKey('element', $datas); // Below is useless test as currently a lazaret intance is returned if ('record' == $datas['element']) { $id = explode('_', $datas['id']); $record = new \record_adapter(self::$DI['app'], $id[0], $id[1]); $this->assertTrue($record->get_thumbnail()->is_physically_present()); $fields = $record->get_caption()->get_fields(['FileName']); $field = array_pop($fields); $this->assertEquals('KIKOO.JPG', $field->get_serialized_values()); } }