【问题标题】:How can I insert file from POST into longblob column using PHP 7 and MySQL?如何使用 PHP 7 和 MySQL 将文件从 POST 插入 longblob 列?
【发布时间】:2017-02-24 12:14:21
【问题描述】:

我正在使用 PHP 7 和 MariaDB 5.5.47(在 CentOS 7 上),以下代码成功执行,没有错误:

$id = 3;
$tmp_name = $_FILES['file']['tmp_name'];
$fp = fopen($tmp_name, 'rb');

$statement = $db->prepare("INSERT INTO Foo (id, data) VALUES (?, ?)");
$statement->bindParam(1, $id);
$statement->bindParam(2, $fp, PDO::PARAM_LOB);
$statement->execute();
$statement->closeCursor();
close($fp);

使用 MySQL WorkBench 它显示“数据”列是“BLOB”(与 null 相反,如果我什么都不插入)。当我尝试查询数据时,它是零字节。这段代码适用于 PHP 5,但我没有找到任何不能适用于 PHP 7 的原因。

【问题讨论】:

  • 此代码有效,直到我尝试上传更大的文件(例如 > 20mb)。看我的“答案”

标签: php mysql pdo mariadb


【解决方案1】:

切换到阅读内容并将其传递给工作。

$fp = fopen($tmp_name, 'rb');
$content = fread($fp, filesize($tmp_name));
// ...
$statement->bindParam(2, $content, PDO::PARAM_LOB, $size);

但是,我在上传大于 20mb 的文件时遇到了内存错误:

致命错误:允许的内存大小为 134217728 字节已用尽 (试图分配 81606320 字节)在 /var/www/app/API/docs.php 在线 498

【讨论】:

    【解决方案2】:

    使用 PHP 方式增加其内存使用量:

    ini_set('memory_limit', '210M');

    请注意,它已经分配了 128M,并且试图再分配 80M ——这是文件的大小吗?

    根据需要调整 init_set 中的值。但是...如果 MySQL 在同一台服务器上,那么您应该向下调整它。 innodb_buffer_pool_size 可能需要调整。

    请记住,交换对性能很不利。

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 2015-09-19
      • 2013-12-27
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2017-11-04
      • 2022-11-11
      • 2022-01-26
      相关资源
      最近更新 更多