public function connect(Application $app) { $app['controller.prod.tools'] = $this; $controllers = $app['controllers_factory']; $app['firewall']->addMandatoryAuthentication($controllers); $controllers->before(function (Request $request) use($app) { $app['firewall']->requireRight('doctools'); }); $controllers->get('/', function (Application $app, Request $request) { $records = RecordsRequest::fromRequest($app, $request, false); $metadatas = false; $record = null; if (count($records) == 1) { $record = $records->first(); if (!$record->is_grouping()) { try { $metadatas = $app['exiftool.reader']->files($record->get_subdef('document')->get_pathfile())->first()->getMetadatas(); } catch (PHPExiftoolException $e) { } catch (\Exception_Media_SubdefNotFound $e) { } } } $var = ['records' => $records, 'record' => $record, 'metadatas' => $metadatas]; return $app['twig']->render('prod/actions/Tools/index.html.twig', $var); }); $controllers->post('/rotate/', function (Application $app, Request $request) { $return = ['success' => true, 'errorMessage' => '']; $records = RecordsRequest::fromRequest($app, $request, false); $rotation = in_array($request->request->get('rotation'), ['-90', '90', '180']) ? $request->request->get('rotation', 90) : 90; foreach ($records as $record) { foreach ($record->get_subdefs() as $name => $subdef) { if ($name == 'document') { continue; } try { $subdef->rotate($rotation, $app['media-alchemyst'], $app['mediavorus']); } catch (\Exception $e) { } } } return $app->json($return); })->bind('prod_tools_rotate'); $controllers->post('/image/', function (Application $app, Request $request) { $return = ['success' => true]; $selection = RecordsRequest::fromRequest($app, $request, false, ['canmodifrecord']); foreach ($selection as $record) { $substituted = false; foreach ($record->get_subdefs() as $subdef) { if ($subdef->is_substituted()) { $substituted = true; break; } } if (!$substituted || $request->request->get('ForceThumbSubstit') == '1') { $record->rebuild_subdefs(); } } return $app->json($return); })->bind('prod_tools_image'); $controllers->post('/hddoc/', function (Application $app, Request $request) { $success = false; $message = $app->trans('An error occured'); if ($file = $request->files->get('newHD')) { if ($file->isValid()) { $fileName = $file->getClientOriginalName(); try { $tempoDir = tempnam(sys_get_temp_dir(), 'substit'); unlink($tempoDir); mkdir($tempoDir); $tempoFile = $tempoDir . DIRECTORY_SEPARATOR . $fileName; if (false === rename($file->getPathname(), $tempoFile)) { throw new RuntimeException('Error while renaming file'); } $record = new \record_adapter($app, $request->get('sbas_id'), $request->get('record_id')); $media = $app['mediavorus']->guess($tempoFile); $app['subdef.substituer']->substitute($record, 'document', $media); $app['phraseanet.logger']($record->get_databox())->log($record, \Session_Logger::EVENT_SUBSTITUTE, 'HD', ''); if ((int) $request->request->get('ccfilename') === 1) { $record->set_original_name($fileName); $app['phraseanet.SE']->updateRecord($record); } unlink($tempoFile); rmdir($tempoDir); $success = true; $message = $app->trans('Document has been successfully substitued'); } catch (\Exception $e) { $message = $app->trans('file is not valid'); } } else { $message = $app->trans('file is not valid'); } } else { $app->abort(400, 'Missing file parameter'); } return $app['twig']->render('prod/actions/Tools/iframeUpload.html.twig', ['success' => $success, 'message' => $message]); })->bind('prod_tools_hd_substitution'); $controllers->post('/chgthumb/', function (Application $app, Request $request) { $success = false; $message = $app->trans('An error occured'); if ($file = $request->files->get('newThumb')) { if ($file->isValid()) { try { $fileName = $file->getClientOriginalName(); $tempoDir = tempnam(sys_get_temp_dir(), 'substit'); unlink($tempoDir); mkdir($tempoDir); $tempoFile = $tempoDir . DIRECTORY_SEPARATOR . $fileName; if (false === rename($file->getPathname(), $tempoFile)) { throw new RuntimeException('Error while renaming file'); } $record = new \record_adapter($app, $request->get('sbas_id'), $request->get('record_id')); $media = $app['mediavorus']->guess($tempoFile); $app['subdef.substituer']->substitute($record, 'thumbnail', $media); $app['phraseanet.logger']($record->get_databox())->log($record, \Session_Logger::EVENT_SUBSTITUTE, 'thumbnail', ''); unlink($tempoFile); rmdir($tempoDir); $success = true; $message = $app->trans('Thumbnail has been successfully substitued'); } catch (\Exception $e) { $message = $app->trans('file is not valid'); } } else { $message = $app->trans('file is not valid'); } } else { $app->abort(400, 'Missing file parameter'); } return $app['twig']->render('prod/actions/Tools/iframeUpload.html.twig', ['success' => $success, 'message' => $message]); })->bind('prod_tools_thumbnail_substitution'); $controllers->post('/thumb-extractor/confirm-box/', function (Application $app, Request $request) { $return = ['error' => false, 'datas' => '']; $template = 'prod/actions/Tools/confirm.html.twig'; try { $record = new \record_adapter($app, $request->request->get('sbas_id'), $request->request->get('record_id')); $var = ['video_title' => $record->get_title(), 'image' => $request->request->get('image', '')]; $return['datas'] = $app['twig']->render($template, $var); } catch (\Exception $e) { $return['datas'] = $app->trans('an error occured'); $return['error'] = true; } return $app->json($return); }); $controllers->post('/thumb-extractor/apply/', function (Application $app, Request $request) { $return = ['success' => false, 'message' => '']; try { $record = new \record_adapter($app, $request->request->get('sbas_id'), $request->request->get('record_id')); $dataUri = DataURI\Parser::parse($request->request->get('image', '')); $path = $app['root.path'] . '/tmp'; $name = sprintf('extractor_thumb_%s', $record->get_serialize_key()); $fileName = sprintf('%s/%s.png', $path, $name); file_put_contents($fileName, $dataUri->getData()); $media = $app['mediavorus']->guess($fileName); $app['subdef.substituer']->substitute($record, 'thumbnail', $media); $app['phraseanet.logger']($record->get_databox())->log($record, \Session_Logger::EVENT_SUBSTITUTE, 'thumbnail', ''); unset($media); $app['filesystem']->remove($fileName); $return['success'] = true; } catch (\Exception $e) { $return['message'] = $e->getMessage(); } return $app->json($return); }); return $controllers; }
/** * @param $record * @param $subDefName * @param $subDefDataUri * @throws \DataURI\Exception\InvalidDataException */ private function substituteMedia($record, $subDefName, $subDefDataUri) { $dataUri = Parser::parse($subDefDataUri); $name = sprintf('extractor_thumb_%s', $record->get_serialize_key()); $fileName = sprintf('%s/%s.png', sys_get_temp_dir(), $name); file_put_contents($fileName, $dataUri->getData()); $media = $this->app->getMediaFromUri($fileName); $this->getSubDefinitionSubstituer()->substitute($record, $subDefName, $media); $this->getDataboxLogger($record->get_databox())->log($record, \Session_Logger::EVENT_SUBSTITUTE, $subDefName, ''); unset($media); $this->getFilesystem()->remove($fileName); }
/** * Upload processus * * @param Application $app The Silex application * @param Request $request The current request * * parameters : 'bas_id' int (mandatory) : The id of the destination collection * 'status' array (optional) : The status to set to new uploaded files * 'attributes' array (optional) : Attributes id's to attach to the uploaded files * 'forceBehavior' int (optional) : Force upload behavior * - 0 Force record * - 1 Force lazaret * * @return Response */ public function upload(Application $app, Request $request) { $datas = ['success' => false, 'code' => null, 'message' => '', 'element' => '', 'reasons' => [], 'id' => '']; if (null === $request->files->get('files')) { throw new BadRequestHttpException('Missing file parameter'); } if (count($request->files->get('files')) > 1) { throw new BadRequestHttpException('Upload is limited to 1 file per request'); } $base_id = $request->request->get('base_id'); if (!$base_id) { throw new BadRequestHttpException('Missing base_id parameter'); } if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_base($base_id, 'canaddrecord')) { throw new AccessDeniedHttpException('User is not allowed to add record on this collection'); } $file = current($request->files->get('files')); if (!$file->isValid()) { throw new BadRequestHttpException('Uploaded file is invalid'); } try { // Add file extension, so mediavorus can guess file type for octet-stream file $uploadedFilename = $file->getRealPath(); $renamedFilename = $file->getRealPath() . '.' . pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION); $app['filesystem']->rename($uploadedFilename, $renamedFilename); $media = $app['mediavorus']->guess($renamedFilename); $collection = \collection::get_from_base_id($app, $base_id); $lazaretSession = new LazaretSession(); $lazaretSession->setUser($app['authentication']->getUser()); $app['EM']->persist($lazaretSession); $packageFile = new File($app, $media, $collection, $file->getClientOriginalName()); $postStatus = $request->request->get('status'); if (isset($postStatus[$collection->get_base_id()]) && is_array($postStatus[$collection->get_base_id()])) { $postStatus = $postStatus[$collection->get_base_id()]; $status = ''; foreach (range(0, 31) as $i) { $status .= isset($postStatus[$i]) ? $postStatus[$i] ? '1' : '0' : '0'; } $packageFile->addAttribute(new Status($app, strrev($status))); } $forceBehavior = $request->request->get('forceAction'); $reasons = []; $elementCreated = null; $callback = function ($element, $visa, $code) use($app, &$reasons, &$elementCreated) { foreach ($visa->getResponses() as $response) { if (!$response->isOk()) { $reasons[] = $response->getMessage($app['translator']); } } $elementCreated = $element; }; $code = $app['border-manager']->process($lazaretSession, $packageFile, $callback, $forceBehavior); $app['filesystem']->rename($renamedFilename, $uploadedFilename); if (!!$forceBehavior) { $reasons = []; } if ($elementCreated instanceof \record_adapter) { $id = $elementCreated->get_serialize_key(); $element = 'record'; $message = $app->trans('The record was successfully created'); $app['phraseanet.SE']->addRecord($elementCreated); // try to create thumbnail from data URI if ('' !== ($b64Image = $request->request->get('b64_image', ''))) { try { $dataUri = Parser::parse($b64Image); $fileName = $app['temporary-filesystem']->createTemporaryFile('base_64_thumb', null, "png"); file_put_contents($fileName, $dataUri->getData()); $media = $app['mediavorus']->guess($fileName); $app['subdef.substituer']->substitute($elementCreated, 'thumbnail', $media); $app['phraseanet.logger']($elementCreated->get_databox())->log($elementCreated, \Session_Logger::EVENT_SUBSTITUTE, 'thumbnail', ''); unset($media); $app['temporary-filesystem']->clean('base_64_thumb'); } catch (DataUriException $e) { } } } else { $app['dispatcher']->dispatch(PhraseaEvents::LAZARET_CREATE, new LazaretEvent($elementCreated)); $id = $elementCreated->getId(); $element = 'lazaret'; $message = $app->trans('The file was moved to the quarantine'); } $datas = ['success' => true, 'code' => $code, 'message' => $message, 'element' => $element, 'reasons' => $reasons, 'id' => $id]; } catch (\Exception $e) { $datas['message'] = $app->trans('Unable to add file to Phraseanet'); } $response = $app->json($datas); // IE 7 and 8 does not correctly handle json response in file API // lets send them an html content-type header $response->headers->set('Content-type', 'text/html'); return $response; }
public function testGetIconURI() { Parser::parse($this->getProvider()->getIconURI()); }