Tôi có một hệ thống (ứng dụng dựa trên web) để kéo tệp đính kèm từ hệ thống bên thứ 3 thông qua SOAP. Chúng lần lượt được bật trên hệ thống của chúng tôi được tạo dưới dạng tệp trong một thư mục.
Khi người dùng hệ thống (được xác thực qua ldap) đưa ra yêu cầu đến ứng dụng của tôi để lấy một trong các tệp đính kèm sau:
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.
Trước hết, đây có phải là một cách tiếp cận tốt?
Có cách nào tốt hơn để phục vụ các tệp không cư trú trên máy chủ nhiều sau khi tải xuống tệp đính kèm (công việc cron sẽ dọn sạch thư mục thường xuyên)?
Thứ hai, có cách nào tôi có thể phục vụ các tệp thông qua apache mà không lưu trữ chúng trong thư mục gốc không?
Thứ ba, làm cách nào để tôi thực thi quyền trên các tệp này để không phải bất kỳ người dùng nào cũng có thể tải xuống bất kỳ tệp đính kèm nào?
Thiết lập của chúng tôi:
linux
apache
php - soap libraries for communication
seperate LDAP for authentication
3rd party soap server (where attachments come from)
EDIT: Mã để phục vụ tệp đính kèm trong trường hợp bất kỳ ai cũng tò mò.
<?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']));
}
?>