J'ai un système (application Web) qui extrait les pièces jointes d'un système tiers via SOAP. Ce sont à leur tour notre système créé sous forme de fichiers dans un répertoire.
Lorsqu'un utilisateur du système (authentifié via ldap) fait une demande à mon application pour récupérer l'une de ces pièces jointes:
1. I request it via soap
2. Process the response to build the file on our system
3. Redirect user to the location so they can download the file.
Tout d'abord, est-ce une bonne approche?
Existe-t-il un meilleur moyen de servir des fichiers qui ne résideront pas sur le serveur bien après le téléchargement des pièces jointes (le travail cron nettoiera le répertoire de temps en temps)?
Deuxièmement, existe-t-il un moyen de servir des fichiers via Apache sans les stocker dans la racine Web?
Troisièmement, comment puis-je appliquer des autorisations sur ces fichiers afin que tout utilisateur ne puisse télécharger que n'importe quelle pièce jointe?
Notre configuration:
linux
apache
php - soap libraries for communication
seperate LDAP for authentication
3rd party soap server (where attachments come from)
EDIT: Le code pour servir la pièce jointe au cas où quelqu'un serait curieux.
<?php
ini_set('display_errors',1);
error_reporting(E_ALL|E_STRICT);
//require global definitions
require_once("includes/globals.php");
//validate the user before continuing
isValidUser();
$subTitle = "Attachment";
$attachmentPath = "/var/www/html/DEVELOPMENT/serviceNow/selfService/uploads/";
if(isset($_GET['id']) and !empty($_GET['id'])){
//first lookup attachment meta information
$a = new Attachment();
$attachment = $a->get($_GET['id']);
//filename will be original file name with user name.n prepended
$fileName = $attachmentPath.$_SESSION['nameN'].'-'.$attachment->file_name;
//instantiate new attachmentDownload and query for attachment chunks
$a = new AttachmentDownload();
$chunks= $a->getRecords(array('sys_attachment'=>$_GET['id'], '__order_by'=>'position'));
$fh = fopen($fileName.'.gz','w');
// read and base64 encode file contents
foreach($chunks as $chunk){
fwrite($fh, base64_decode($chunk->data));
}
fclose($fh);
//open up filename for writing
$fh = fopen($fileName,'w');
//open up filename.gz for extraction
$zd = gzopen($fileName.'.gz', "r");
//iterate over file and write contents
while (!feof($zd)) {
fwrite($fh, gzread($zd, 60*57));
}
fclose($fh);
gzclose($zd);
unlink($fileName.'.gz');
$info = pathinfo($fileName);
header('Content-Description: File Transfer');
header('Content-Type: '.Mimetypes::get($info['extension']));
header('Content-Disposition: attachment; filename=' . basename($fileName));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($fileName));
ob_clean();
flush();
readfile($fileName);
exit();
}else{
header("location: ".$links['status']."?".urlencode("item=incident&action=view&status=-1&place=".$links['home']));
}
?>