代码之家  ›  专栏  ›  技术社区  ›  user1427930

显示文件而不阻止php中的应用程序

  •  0
  • user1427930  · 技术社区  · 3 年前

    我在Apache2上提供一个php应用程序。在一个函数中,我只想显示媒体,使用php脚本,而不是将媒体托管在服务器上的公共文件夹中。

    这是因为我希望以后能够添加功能来控制登录用户的权限,并首先检查文件扩展名等。

    我试过了 fpassthrough 和 读取文件 并且这两个功能都完全阻塞了应用程序。尤其是当有视频>10mb。

    这是代码的一个版本:

    display_file.php?filename=foo.jpg

    if (empty($_GET['filename']))
    {
        die(http_response_code(500)):
    }
    
    $filename = $_GET['filename'];
    $extension = file_extension($filename); // .jpg|.mp4 etc
    $mime = mime($ext); // get mine_type
    $uri = '/foo/bar/'.$filename;
    
    
    // Only allow sertain extensions
    if (!in_array($ext, ALLOWED_FILE_EXTENSIONS)) // ['jpg','png','mp4'...]
    {
        die(http_response_code(403));
    }
    
    // File doesn't exist
    if (!file_exists($uri))
    {
        die(http_response_code(404));
    }
    
    $size = filesize($uri);
    $start = 0;
    $end = $size - 1;
    $time = filemtime($uri);
    $expires = gmdate('D, d M Y H:i:s \G\M\T', $time + (60 * 60));
    $modified = gmdate('D, d M Y H:i:s \G\M\T', $time);
    
    //$fp = fopen($uri, 'rb');
    
    header('Pragma: cache');
    header('Cache-Control: max-age=31536000');
    header('Expires: '.$expires);
    header('Content-Type: '.$mime);
    header('Content-Length: '.$size);
    header('Accept-Ranges: bytes');
    header("Content-Range: bytes $start-$end/$size");
    header('Last-Modified: '.$modified);
    
    //fpassthru($fp);
    readfile($uri);
    

    如果我使用Apache2直接通过公共文件夹显示文件,该应用程序不会被阻止。

    有没有其他方法可以在不阻塞整个应用程序的情况下提供/显示带有php用户检查、扩展等的文件?

    0 回复  |  直到 3 年前
        1
  •  0
  •   symcbean    3 年前

    你的分析/描述不清楚。你说的“屏蔽应用程序”是什么意思?你是如何衡量的?

    我怀疑这里发生的事情是 一场 被阻止,而不是应用程序,尽管内容文件被锁定可能存在问题。

    您向我们展示的代码不会阻止会话——没有会话。但代码显然是不完整的。添加 session_write_close() 之前 readfile() 将解析(或使用非阻塞会话处理程序)。

    锁定内容文件的可能性较小,但您没有告诉我们这是在什么操作系统上运行的,因此我们无法告诉您如何进一步调查。