Ho un sistema (applicazione web based) che estrae i file allegati da un sistema di terze parti tramite SOAP. Questi sono a loro volta sul nostro sistema creato come file in una directory.
Quando un utente del sistema (autenticato tramite ldap) invia una richiesta alla mia applicazione per recuperare uno di questi allegati:
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.
Prima di tutto, è un buon approccio?
C'è un modo migliore per servire i file che non risiederanno sul server molto dopo il download dell'allegato (cron job pulirà la directory ogni tanto)?
In secondo luogo, c'è un modo in cui posso servire i file tramite apache senza memorizzarli nella web root?
In terzo luogo, come posso applicare le autorizzazioni per questi file in modo che non tutti gli utenti possano scaricare qualsiasi allegato?
La nostra configurazione:
linux
apache
php - soap libraries for communication
seperate LDAP for authentication
3rd party soap server (where attachments come from)
EDIT: il codice per servire l'allegato nel caso qualcuno fosse curioso.
<?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']));
}
?>