Skip to content
Snippets Groups Projects
Commit 57edb55e authored by Eric Quinton's avatar Eric Quinton
Browse files

:feat file: modification de la durée de vie des liens

ajout d'une variable dans dbparam
parent 87c2b726
No related branches found
No related tags found
No related merge requests found
......@@ -87,7 +87,8 @@ class File extends PpciLibrary
if (empty($_REQUEST["uid"])) {
throw new PpciException(_("Pas de lien fourni pour télécharger le fichier"));
}
$this->id = $filelink->getFileIdFromLink($_REQUEST["uid"]);
$dfilelink = $filelink->getFromLink($_REQUEST["uid"]);
$this->id = $dfilelink["file_id"];
$data = $this->dataclass->lire($this->id);
if ($data["storage_type"] == "I") {
$path = $_SESSION["dbparams"]["real_storage_path"] . "/" . $data["storage_path"];
......@@ -97,6 +98,7 @@ class File extends PpciLibrary
$path = $dproject["external_path"] . "/" . $data["storage_path"];
}
if (file_exists($path)) {
$filelink->updateLastUse($dfilelink["filelink_id"]);
$this->vue = service("BinaryView");
$this->vue->setParam(
array(
......@@ -163,9 +165,10 @@ class File extends PpciLibrary
$filelink->fileObject = $this->dataclass;
$content = array();
$radical = $this->appConfig->baseURL . "/fileGetExternal";
$duration = $_SESSION["dbparams"]["fileLinkDuration"];
try {
foreach ($_POST["files"] as $file_id) {
$item = array("link" => $radical . "?uid=" . $filelink->generateLink($file_id));
$item = array("link" => $radical . "?uid=" . $filelink->generateLink($file_id, $duration));
$data = $this->dataclass->lire($file_id);
if (projectVerify($data["project_id"])) {
$item["filename"] = $data["filename"];
......@@ -194,9 +197,10 @@ class File extends PpciLibrary
$filelink->fileObject = $this->dataclass;
$content = array();
$radical = $this->appConfig->baseURL . "/fileGetExternal";
$duration = $_SESSION["dbparams"]["fileLinkDuration"];
try {
foreach ($_POST["files"] as $file_id) {
$item = array("link" => $radical . "?uid=" . $filelink->generateLink($file_id));
$item = array("link" => $radical . "?uid=" . $filelink->generateLink($file_id, $duration));
$data = $this->dataclass->lire($file_id);
if (projectVerify($data["project_id"])) {
$content[] = $item;
......
......@@ -31,9 +31,9 @@ class Filelink extends PpciModel
),
"expiration_date" => array(
"type" => 3,
"requis" => 1,
"defaultValue" => "generateExpirationDate"
)
"requis" => 1
),
"last_use" => ["type" => 3]
);
parent::__construct();
}
......@@ -84,17 +84,17 @@ class Filelink extends PpciModel
}
/**
* Get the if of the file from the link
* Get the data from the link
*
* @param string $link
* @return integer
* @return array
*/
function getFileIdFromLink(string $link): int
function getFromLink(string $link): array
{
if (!isset($this->fileObject)) {
$this->fileObject = new FileClass;
}
$sql = "select file_id, expiration_date
$sql = "select file_id, expiration_date, filelink_id
from filelink
where linkname = :link:
and expiration_date > :expiration_date:";
......@@ -102,6 +102,11 @@ class Filelink extends PpciModel
if (empty($data["file_id"])) {
throw new PpciException(_("Le lien fourni n'existe pas ou est expiré"));
}
return $data["file_id"];
return $data;
}
function updateLastUse(int $id) {
$sql = "update filelink set last_use = :lastuse: where filelink_id = :id:";
$this->executeQuery($sql, ["lastuse"=>date('Y-m-d H:i:s'),"id"=>$id], true);
}
}
......@@ -7,7 +7,31 @@ Les fichiers ne sont pas stockés directement dans la base de données pour des
* charger un fichier directement depuis son ordinateur : le fichier va être stocké dans une arborescence accessible depuis le serveur web ;
* associer un fichier déjà présent dans une arborescence : c'est la solution à privilégier pour les fichiers volumineux (dépassant quelques Mo) issus des machines d'analyse.
Pour que les fichiers puissent être manipulés, des configurations spécifiques sont à paramétrer.
Pour que les fichiers puissent être manipulés, il faut paramétrer les emplacements de stockage utilisés.
D'autre part, il est possible de générer une liste de liens qui permettra à un correspondant de télécharger directement des fichiers, sans qu'il lui soit nécessaire de se connecter dans l'application.
## Associer des fichiers à un objet de la base de données
Dans le détail des objets manipulés (expérimentation, etc.), vous retrouverez un onglet _Fichiers_. En cliquant sur le lien _Importer un ou plusieurs fichiers_, vous affichez deux formulaires de saisie.
Celui de gauche vous permet de télécharger des fichiers depuis votre ordinateur : les fichiers seront stockés dans une arborescence dédiée dans le serveur. Il suffit alors de sélectionner les fichiers à importer pour que ceux-ci soient téléchargés.
Attention : seuls certains types de fichiers sont autorisés au téléchargement. Si vous devez ajouter des fichiers dont le type n'existe pas, vous devrez auparavant le décrire depuis cette [liste](mimetypeList).
Celui de droite va afficher la liste des fichiers qui existent déjà dans l'arborescence bureautique. Vous pouvez naviguer dans les sous-dossiers (s'ils existent). En cliquant sur un fichier, celui-ci sera alors automatiquement associé à l'objet que vous manipulez.
## Générer des liens de téléchargement
Depuis le détail du projet, dans l'onglet *Tous fichiers associés*, sélectionnez les fichiers pour lesquels vous souhaitez générer un lien. Sélectionnez ensuite, dans le formulaire situé sous la liste, soit :
- la génération de liens de téléchargement "simples"
- la génération des liens associés avec un code de contrôle et comprenant le nom du fichier
La liste est fournie sous la forme d'un fichier CSV.
le second choix est plus destiné à des systèmes de traitement automatiques, qui vont vérifier l'intégrité du fichier chargé.
Attention : les liens de téléchargement ne sont valables que 7 jours par défaut. Si vous souhaitez modifier leur durée de vie, vous devrez modifier les paramètres de l'application (menu *Administration > Paramètres de l'application*) et mettre à jour la variable *fileLinkDuration*.
## Configuration
......
......@@ -6,8 +6,15 @@ values (
'code_of_instance',
'Code de l''instance, pour les exportations',
'Code of the instance, to export data'
)
)
on conflict do nothing;
insert into dbparam (dbparam_name, dbparam_value, dbparam_description, dbparam_description_en)
values (
'fileLinkDuration',
'7',
'Durée de vie des liens de téléchargement des fichiers, en jours',
'Lifetime of file download links, in days'
);
alter table gacl.acllogin add column email varchar;
alter table gacl.logingestion add column if not exists is_expired boolean;
alter table gacl.logingestion add column if not exists nbattempts integer;
......
......@@ -677,7 +677,7 @@ class PpciModel extends Model
if (!empty($row[$field])) {
$date = date_create_from_format($this->datetimeFormat, $row[$field]);
if ($date) {
$row[$field] = date_format($date, "Y-m-d h:i:s");
$row[$field] = date_format($date, "Y-m-d H:i:s");
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment