当前位置: 首页 > 面试题库 >

如何通过PHP脚本下载大文件

蔚琦
2023-03-14
问题内容

使用PHP,我试图提供由于授权问题而不在网络可访问目录中的大文件(最大可能为200MB)。当前,我使用一个readfile()调用以及一些标头来提供文件,但是似乎PHP在发送之前先将其加载到内存中。我打算在共享托管服务器上进行部署,这将不允许我使用太多内存或添加自己的Apache模块(例如X-
Sendfile)。

出于安全原因,我不能让我的文件位于可通过网络访问的目录中。有人知道我可以在共享主机服务器上部署的内存占用较少的方法吗?

编辑:

if(/* My authorization here */) {
        $path = "/uploads/";
        $name = $row[0];           //This is a MySQL reference with the filename
        $fullname = $path . $name; //Create filename
        $fd = fopen($fullname, "rb");
        if ($fd) {
            $fsize = filesize($fullname);
            $path_parts = pathinfo($fullname);
            $ext = strtolower($path_parts["extension"]);
            switch ($ext) {
                case "pdf":
                header("Content-type: application/pdf");
                break;
                case "zip":
                header("Content-type: application/zip");
                break;
                default:
                header("Content-type: application/octet-stream");
                break;
            }
            header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
            header("Content-length: $fsize");
            header("Cache-control: private"); //use this to open files directly
            while(!feof($fd)) {
                $buffer = fread($fd, 1*(1024*1024));
                echo $buffer;
                ob_flush();
                flush();    //These two flush commands seem to have helped with performance
            }
        }
        else {
            echo "Error opening file";
        }
        fclose($fd);

问题答案:

如果您使用fopenfread而不是readfile,那应该可以解决您的问题。

PHP的文档中有一个解决方案,readfile显示了如何使用它fread来完成您想要的事情。



 类似资料:
  • 本文向大家介绍如何通过PHP脚本下载大文件?,包括了如何通过PHP脚本下载大文件?的使用技巧和注意事项,需要的朋友参考一下 要通过PHP脚本下载大文件,代码如下- 示例 输出结果 这将产生以下输出- 函数“ readfile_chunked”(用户定义)具有两个参数:文件名和返回字节数的默认值“ true”,表示已成功下载大文件。声明了变量“ chunksize”,其中每个块需要读取的字节数。将'

  • 这方面有新的工作吗?

  • 问题内容: 我是一个新手程序员,我搜索了很多有关我的问题的内容,但是找不到关于此的有用的解决方案或教程。 我的目标是我有一个PHP数组,并且数组元素显示在页面上的列表中。 我想添加一个选项,以便用户如果需要,他/她可以创建带有数组元素的CSV文件并下载。 我不知道该怎么做。我也搜索了很多。但尚未找到任何有用的资源。 请为我提供一些教程或解决方案或建议以自己实施。由于我是新手,请提供易于实施的解决方

  • 我正在尝试下载大文件( 这是因为它在不使用太多内存的情况下下载文件,但它似乎不必要地无效,因为它不断尝试写入更多数据,而不知道是否有任何新数据到达。这似乎也通过我自己的测试得到了证实,同时在资源非常有限的VM上运行它,因为它似乎使用了更多的CPU,同时下载速度低于python中的类似脚本,并且使用是有原因的。 我想知道是否有一种方法可以让某些东西回调,如果x字节可用,或者它是文件的末尾,那么我就可

  • ; 该脚本使用 HM VNISEdit 脚本编辑器向导产生 ; 安装程序初始定义常量 !define PRODUCT_NAME "下载专用程序" !define PRODUCT_VERSION "1.0" SetCompressor lzma ; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------ !include "MUI.nsh" ; MUI 预定义常量 !d

  • 问题内容: 我有一个按钮,它将调用ajax函数。 这是我的ajax功能 我根据用户输入创建csv文件。创建之后,我希望它提示下载或强制下载(最好是强制)。我在php文件的末尾使用以下脚本来下载文件。如果我在单独的文件中运行此脚本,则可以正常运行。 但是,如果我在csv.php的末尾运行它,它会将file.csv的内容输出到页面中(进入ajaxDiv)而不是下载。 有没有办法强制在csv.php的末