我开发了一个通过安全URL传递文件的脚本,目标是模仿Amazon S3的私有文件托管。用户将向服务器发送请求,该请求生成可用于访问文件的URL。生成的URL在生成后2小时后过期。
这是脚本的解密部分:
$data = decrypt($_GET['data']);
$data_json = json_decode($data,true);
// print_r($data_json); die;
$elapsed = strtotime('now') - $data_json['expire'];
if ($elapsed > URLEXPIRE) {
echo json_encode(array(
'status'=>false,
'error'=>'URL expired.',
'debug'=>$data,
'debug2'=>$_GET['data']
));
die;
}
$object = OBJECTSTORE . $data_json['path'];
header('X-Elapsed: ' . $elapsed);
// header('Content-Type: '.get_mime_type($object));
header('Content-Type: application/octet-stream');
// header('Content-Disposition: attachment; filename=' . basename($object));
if (strpos($data_json['path'],'?download'))
header('Content-Disposition: attachment;');
// echo file_get_contents($object);
readfile($object);
die;
在我的登台服务器上测试期间,脚本运行正常。但是,在提供大型视频文件时在生产中发布时似乎很慢。将URL加载为HTML视频标记的源需要一段时间。我不知道这是否有帮助,但decrypt
函数使用AES-256-CBC密码使用openssl_decrypt
。
是否有更有效的方法来解决这个问题?
答案 0 :(得分:0)
在readfile()之前验证输出缓冲区是否已关闭:添加ob_end_clean()。 此外,readfile对于大文件可能效率不高。见Readfile() and large files