【问题标题】:Extracting all images from mysql database blob to directory将所有图像从 mysql 数据库 blob 提取到目录
【发布时间】:2016-12-18 19:40:34
【问题描述】:

我正在努力从 blob 中提取图片,如图所示 图像当前无法显示,因为它包含错误 当我下载它 解释 JPEG 图像文件时出错(不支持的标记类型 0x5c) 并尝试识别文件是哪个文件并通过“linux shell”获取它

[无]$ 文件 PICTURE.bin PICTURE.bin:JPEG 图像数据 识别:不支持的标记类型 0x5c `PICTURE.bin' @error/jpeg.c/JPEGErrorHandler/322

我尝试通过文本编辑器打开它,一开始就得到了这个奇怪的东西,而不是 JPEG 或 JPG。它在图像文件的开头显示类似“JFIF”的内容 我尝试了一个 php 脚本来提取图像并直接从 phpmyadmin 下载它,但没有成功 我使用的脚本是“不是我的,我在网上找到的”:

<?php

// ************* MODIFY THESE FOR YOUR SERVER AND DATABASE SETTINGS *************

// y = first letter in yourdomain.com
// o = second letter in yourdomain.com
$basedir = '/home/zzz/public_html/z/'; // Needs trailing slash
$host    = 'localhost';
$user    = 'zz';  //(user information)
$password= 'zz';  //(password information)
$dbname  = 'zzz';

$type            = 'jpg';
$blob_id         = 'APLT_ID';
$blob_data       = 'PICTURE';
$blob_table      = 'zzzz';

// ************************************************** ***************



$db = mysql_connect($host, $user, $password) or die("Could not connect: " . mysql_error());
mysql_select_db($dbname, $db);

$sql = "SELECT $blob_id, $blob_data FROM $blob_table";
echo $sql;
$result = mysql_query($sql);

header('Content-Type: text/html; charset=utf-8');

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $id = $row["$blob_id"];
    $data = $row["$blob_data"];
    $file = "$basedir$id.$type";
    echo "Looking for File: $file<br>";
    if (!file_exists($file)) {
        $fp=fopen($file,"w");
        echo "Opening File: $file<br>";
        fwrite($fp,$data);
        echo "Writing File: $file<br>";
    } else {
        echo "Skipping File: $file<br>";
        fclose($fp);
        echo "Closeing File: $file<br>";
    }
    sleep(1);
}

mysql_free_result($result);
?>

图像可以编码吗?

因为在发布和寻求帮助之前,我只是浪费了 2 天的时间试图弄清楚这件事

【问题讨论】:

  • 每次在新代码中使用the mysql_ 数据库扩展a Kitten is strangled somewhere in the world 时,它都已被弃用,并且已经存在多年,并且在 PHP7 中永远消失了。如果您只是学习 PHP,请花精力学习 PDOmysqli 数据库扩展。 Start here
  • 听起来好像存储不正确。您在获取文件时是否使用了binmode 或其他任何内容?
  • 不,我试图通过 phpmyadmin 或上面的这个脚本来获取它。

标签: php mysql sql encoding base64


【解决方案1】:

图像是二进制数据,需要以二进制模式存储,无需对换行符进行任何更改。更改您的代码以以二进制模式打开/创建文件,并且如果数据库中的数据有效,那么您的代码应该可以工作。

$fp=fopen($file,"wb");

【讨论】:

  • 我该怎么做?我有0个编程技能兄弟
  • $fp=fopen($file,"w"); 的行更改为$fp=fopen($file,"wb");
  • 试过它不起作用,我试图从文件管理器中列出文件,我看到图片有 500+ kb 大小,所以它确实可以提取我认为,但它可能被编码?
  • 当我通过文本编辑图像时,我在开始 JFIF 时得到这个
  • 你需要fclose文件。
【解决方案2】:

如果您正在寻找 MySQL 查询,试试这个。

root 身份登录到您的 MySQL 服务器

首先,检查 MySQL 允许写入输出文件的位置:

mysql> SELECT @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| /var/lib/mysql-files/     |
+---------------------------+
1 row in set (0.00 sec)

我的系统只能将文件提取到/var/lib/mysql-files/。如果您什么也得不到,您可能可以将文件保存在文件系统的任何位置。

要提取文件,请运行以下 SQL 查询:

SELECT blob_column FROM table WHERE id='some_id' INTO DUMPFILE "/var/lib/mysql-files/file.jpg";

注意:使用DUMPFILE。请使用OUTFILE。这会给你一个损坏的输出文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2011-07-28
    • 2012-03-27
    • 2016-05-26
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多