diff --git a/vas/rest/ws/vitis/File_downloader.class.inc b/vas/rest/ws/vitis/File_downloader.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..ad119c53ce1dc41670a75b01efe9005b92d55e65 --- /dev/null +++ b/vas/rest/ws/vitis/File_downloader.class.inc @@ -0,0 +1,166 @@ +<?php + +/** + * \file File_downloader.class.inc + * \class File_downloader + * + * \author Anthony Borghi <anthony.borghi@veremes.com>. + * + * \brief This file contains the access file php class + * + * This class defines Rest Api to Access file + * + */ +require_once 'Vitis.class.inc'; +require_once ("aws_sdk/aws-autoloader.php"); +require_once ("vmlib/phpUtil.inc"); + +class File_downloader extends Vitis { + /** + * @SWG\Definition( + * definition="/file_downloader", + * allOf={ + * @SWG\Schema(ref="#/definitions/file_downloader") + * } + * ) + * * @SWG\Tag( + * name="File_downloader", + * description="Download a file" + * ) + */ + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + * @param type $bShortcut false to reinit variables + * @param type $oConnection connection object + */ + function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) { + $this->aValues = $aValues; + $this->aProperties = $properties; + } + + /** + * @SWG\Get(path="/file_downloader", + * tags={"File_downloader"}, + * summary="Get File Content", + * description="Request to get File", + * operationId="GET", + * produces={"application/xml", "application/json", "application/x-vm-json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="group token", + * required=true, + * type="string" + * ), + * @SWG\Parameter( + * name="key", + * in="query", + * description="File Path or s3 key", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="eTag", + * in="query", + * description="Hash of content file", + * required=false, + * type="string" + * ), + * @SWG\Response( + * response=200, + * description="Blob of the file", + * @SWG\Schema(ref="#/definitions/file_downloader") + * ) + * ) + */ + + /** + * get File + * @return $sMessage Json or blob + */ + function GET() { + $sMessage = array("status" => 0, "sMessage" => ""); + $bReturnFile = true; + // si un paramètre est manquant on coupe + if ((!empty($this->aValues["key"])) && (!empty($this->aValues["eTag"]))){ + $sPath = ""; + if ($this->aProperties["fileS3Uploader"]){ + $sPath = $this->aProperties['extract_dir'] . "/" . getUniqRandomId(); + // traitement du bucket et de ses sous-dossiers + $sBucket = $this->aProperties['fileS3UploaderBucket']; + $sPrefix = ""; + + if (strpos($sBucket, "/") > -1){ + $aBucket = explode("/", $sBucket ); + $sBucket = $aBucket[0]; + $sPrefix = implode("/", array_slice($aBucket, 1)); + } + // Création du client S3 + $s3 = new Aws\S3\S3Client(array( + 'version'=>'latest', + 'region'=> $this->aProperties['fileS3UploaderRegion'], + 'profile'=> $this->aProperties['fileS3UploaderProfil'], + 'debug' => false + )); + + if(strpos($this->aValues['key'], $sPrefix) === 0){ + // récupération du fichier sur le serveur pour le téléchargement si le Etag correspond avec celui de s3 + try{ + $s3->getObject(array( + 'Bucket' => $sBucket, + 'Key' => $this->aValues['key'], + 'IfMatch' => $this->aValues['eTag'], + 'SaveAs' => $sPath + )); + }catch(Aws\S3\Exception\S3Exception $e){ + error_log($e->getMessage()); + $bReturnFile = false; + $sMessage = array("status" => 0, "sMessage" => "This file doesn't exist or the Etag doesn't match"); + } + } else { + $bReturnFile = false; + $sMessage = array("status" => 0, "sMessage" => "You can't access to this object"); + } + + } else { + // modification de $sPath pour aller chercher le fichier dans ws_data + $sPath = $this->aProperties["ws_data_dir"] . "/" . $this->aValues["key"]; + // check eTag + $bReturnFile = false; + } + + if($bReturnFile){ + session_write_close(); + $this->getFile($sPath, end(explode("/", $this->aValues["key"]))); + unlink($sPath); + } + + } else { + $sMessage = array("status" => 0, "sMessage" => "Missing Parameter"); + } + + return json_encode($sMessage); + } + + function getFile($sFilePath, $sFileName) { + // Le fichier existe ? + if (file_exists($sFilePath)) { + $sContentType = mime_content_type($sFilePath); + header("Content-Type: " . $sContentType); + header("Content-disposition: attachment; filename=\"" . $sFileName . "\""); + header('Content-Length: ' . filesize($sFilePath)); + if ($sContentType === "application/octet-stream") { + header("Content-Transfer-Encoding: Binary"); + } + readfile($sFilePath); + } + } + + +} + +?>