php - 使用 fopen 打开数据库中的文件

标签 php mysql mysqli

我有用于从 mysql 数据库下载文件的 PHP 代码。 我试图将我的下载缓冲到每个 block 1024 中。 但它看起来 fopen 无法从数据库中打开我的文件,它给出了错误。

Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/html/download/get_file_work.php on line 40

如何使用fopen函数打开数据库中的文件。

我的PHP代码

<?php
ob_start();
$company = $_GET['company'];
if(isset($_GET['id']))
  {
    $id = intval($_GET['id']);
    if($id <= 0)
      {
        die('The ID is invalid!');
      }
    else
      {
        $dbLink = new mysqli('localhost', 'sqldata', 'sqldata', 'balhaf');
        if(mysqli_connect_errno())
          {
            die("MySQL connection failed: ". mysqli_connect_error());
          }
        $query = "SELECT mime, name, size, data FROM $company WHERE id = $id";
        $result = $dbLink->query($query);
        if($result)
          {
            if($result->num_rows == 1) {
              $row = mysqli_fetch_assoc($result);
              $size = $row['size'];
              $filename = $row['name'];
              $data = $row['data'];
              $mime = $row['mime'];
              if ($fd = fopen ($data, "r")) {
                ini_get('zlib.output_compression');
                ini_set('zlib.output_compression', 'Off');
                header('Content-Type: application/pdf');
                while (@ob_end_clean());
                header('Content-Disposition: attachment; filename='.($filename));
                header('Content-Length:'.($size));
                while(!feof($fd)) {
                  $buffer = fread($fd, 1024);
                  echo $buffer;
                }
              }
              fclose ($fd);
              exit;
            }
            else
              {
                echo 'Error! No image exists with that ID.';
              }
            mysqli_free_result($result);
          }
        else
          {
            echo "Error! Query failed: <pre>{$dbLink->error}</pre>";
          }
        mysqli_close($dbLink);
      }
  }
else
  {
    echo 'Error! No ID was passed.';
  }
?>

最佳答案

如果$data只是二进制数据,则不能对其使用fopenfopen 仅适用于文件名字符串。事实上,不需要读取数据 block ,因为 $data 显然已经拥有了所有数据。你可以这样做:

// other headers
header('Content-Length:'.($size));
echo $data;
exit;

关于php - 使用 fopen 打开数据库中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18796365/

相关文章:

php - 从 mysql php 制作多级数组

php - 如何获取 mysql 表最后自动生成的字母数字 ID?

将 PHP 7 安装到我的服务器后,PHP 模块不加载

javascript - 如何在单击 Div 后为每个 MySQL 行发出 JavaScript 警报?

php - 哪些大型网站使用 servlet 技术(再次)?

mysql - 日期从 ActiveRecord 恢复到 2000-01-01 到 MySQL

php - 附加许多 mysql_fetch_array 结果

php - 将 mysql_field_flags 转换为 mysqli

php - 错误多个指令 [bar, bar] 在使用自定义指令和 angular-bootstrap 时询问模板

php - 删除相同 "KeyWord"模式的上一条记录