gpt4 book ai didi

php - 使用 PHP 下载大型 "private"文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:08 24 4
gpt4 key购买 nike

我将私有(private)文件存储在服务器(Centos/Apache/PHP)上,授权用户可以使用网络浏览器下载这些文件(确定用户是否获得授权已在其他地方介绍,而不是问题的一部分)。

我使用以下脚本来下载文件。它非常适合小文件,但是当文件很大(~80MB)时它就不起作用了。对于这些,下载的文件是零字节,Adobe 表示它要么是不受支持的类型,要么是由于未编码的电子邮件而损坏。我已经确认服务器上的文件没有问题,所以问题不是由我的上传脚本引起的。

什么可能导致此问题以及如何解决?

另外,有没有更好的方法来限制下载文件?我担心的是我的上述方法可能会给服务器/PHP 带来过多的工作。将 Apache 密码放在目录上并要求用户输入它并不是一个可行的解决方案。不知道是否还有其他东西存在,但我想问一下。

谢谢

/* Given: $file='/var/www/private/filename'
$file_name='xx.pdf'
*/
public function dl_file($file,$file_name)
{
//First, see if the file exists
if (!is_file($file)) { die('Document does not exist'); }

//All this function does is get the appropriate mime type
$fileInfo=library::getFileInfo(library::getExt($file_name));

syslog(LOG_INFO,'Content-Type: '.$fileInfo['mime'].' Content-Disposition: attachment; filename="'.$file_name.'" Content-Length: '.filesize($file));
//Begin writing headers
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Description: File Transfer');

//Use the switch-generated Content-Type
header('Content-Type: '.$fileInfo['mime']);

//Force the download
header('Content-Disposition: attachment; filename="'.$file_name.'"' );
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($file));
readfile($file);
}

上述系统日志的输出:

Jun  1 09:24:15 devserver httpd: Content-Type: application/pdf Content-Disposition: attachment; filename="xx.pdf" Content-Length: 86396350

最佳答案

我认为有以下三个原因:

  • 您的脚本超出了其执行的最长持续时间

  • 下载文件的人的互联网速度太快了慢的。所以你的脚本将超过其最大持续时间执行,只要用户还没有完成下载文件

  • 您的服务器速度很慢,在这种情况下没什么好处要做的事情

解决您问题的方法尝试使用函数:set_time_limit()

**`set_time_limit (int $ seconds ) ;`**

例如 set_limit_time 已尝试 ( 120 ) ;将允许用户在 120 秒内下载文件

您必须计算下载文件需要多长时间,相对于客户的互联网速度以及服务器的速度添加脚本需要执行多长时间

这将是您必须给予 set_limit_time () 函数的时间

希望这对您有帮助

更多信息在这里:http://www.php.net/manual/en/function.set-time-limit.php

为了提高安全性,请使用 mod_xsendfile 这是一个 apache 模块

mod_xsendfile 是一个小型 Apache2 模块,用于处理由原始输出处理程序注册的 X-SENDFILE header 。

如果遇到此类 header 的存在,它将丢弃所有输出并发送该 header 指定的文件,而不是使用 Apache 内部结构,包括所有优化,如缓存 header 和 sendfile 或 mmap(如果配置)。

它对于处理例如以下内容的脚本输出很有用: php、perl 或任何 cgi。

有用吗?

是的,很有用。

Some applications require checking for special privileges.
Other have to lookup values first (e.g.. from a DB) in order to correctly process a download request.
Or store values (download-counters come into mind).
etc.

好处

Uses apache internals
Optimal delivery through sendfile and mmap (if available).
Sets correct cache headers such as Etag and If-Modified-Since as if the file was statically served.
Processes cache headers such as If-None-Match or If-Modified-Since.
Support for ranges.

访问此链接https://tn123.org/mod_xsendfile/

关于php - 使用 PHP 下载大型 "private"文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23982206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com