php怎样读取数据库中的image类型的数据?

h534450007 2017-01-11 01:38:55
现在做个项目要连接别人的数据库,数据库中有一个image类型的数据,里面存放的word文档,是以十六进制存放的。然后我想取出数据,用php转换为word文档存放在我们服务器,但试过很多方法都不行。

用过header("Content-type: application/msword;"); echo $data;好像不行。。也用过pack("H*",$data); $handle = fopen("test.doc", "w"); fwrite($handle, $newdata); fclose($handle);也不行,求大神解答,在线急。。。。。。。。。。
...全文
782 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
傲雪星枫 2017-01-15
  • 打赏
  • 举报
回复
引用 13 楼 h534450007 的回复:
[quote=引用 12 楼 fdipzone 的回复:] 测试了一下,可以把16进制的保存到db,然后读出生成文件。

CREATE TABLE `word` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `type` varchar(10) NOT NULL,
 `content` text NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


<?php
function get_conn($config){
 
    $dbhost = $config['host'];
    $dbname = $config['dbname'];
    $dbuser = $config['user'];
    $dbpasswd = $config['password'];
    $pconnect = $config['pconnect'];
    $charset = $config['charset'];
 
    $dsn = "mysql:host=$dbhost;dbname=$dbname;";
    try {
        $h_param = array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        );
        if ($charset != '') {
            $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼
        }
        if ($pconnect) {
            $h_param[PDO::ATTR_PERSISTENT] = true;
        }
        $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);
 
    } catch (PDOException $e) {
        throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
    }
 
    return $conn;
}
 
$config = array(
    'host' => 'localhost',
    'dbname' => 'test',
    'user' => 'root',
    'password' => '',
    'pconnect' => 0,
    'charset' => ''
);
 
$conn = get_conn($config);

// 把文件内容转16进制放入数据表
$file = 'abc.ods';
$type = explode('.',$file);
$type = $type[1];
$data = bin2hex(file_get_contents($file));

$sql = "insert into word(type,content) values('".$type."','".$data."')";
$stmt = $conn->prepare($sql);
$stmt->execute();

// 把文件内容读出,保存为文件
$sql = "select * from word";
$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->fetchall(PDO::FETCH_ASSOC);
foreach($result as $k=>$row){
    print_r($row);
    $filedata = pack('H*', $row['content']);
    file_put_contents(time().'.'.$row['type'], $filedata, true);
}

?>
谢谢大神,原因找到了,是数据库里面的十六进制数据不完整导致的,用PACK("H*",$data)。是可以解决的。分都给你了。[/quote] 你分有给我么?
h534450007 2017-01-15
  • 打赏
  • 举报
回复
刚才试了一下把转出来的zip包里面的文件重命名一下就可以了。。。。
h534450007 2017-01-15
  • 打赏
  • 举报
回复
@傲雪星枫 我又遇到了一个问题就是用pack("H*",$data)函数转成压缩文件例如zip格式的好像不行,我等下开个新帖你看一下。。。
h534450007 2017-01-15
  • 打赏
  • 举报
回复
引用 12 楼 fdipzone 的回复:
测试了一下,可以把16进制的保存到db,然后读出生成文件。

CREATE TABLE `word` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `type` varchar(10) NOT NULL,
 `content` text NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


<?php
function get_conn($config){
 
    $dbhost = $config['host'];
    $dbname = $config['dbname'];
    $dbuser = $config['user'];
    $dbpasswd = $config['password'];
    $pconnect = $config['pconnect'];
    $charset = $config['charset'];
 
    $dsn = "mysql:host=$dbhost;dbname=$dbname;";
    try {
        $h_param = array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        );
        if ($charset != '') {
            $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼
        }
        if ($pconnect) {
            $h_param[PDO::ATTR_PERSISTENT] = true;
        }
        $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);
 
    } catch (PDOException $e) {
        throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
    }
 
    return $conn;
}
 
$config = array(
    'host' => 'localhost',
    'dbname' => 'test',
    'user' => 'root',
    'password' => '',
    'pconnect' => 0,
    'charset' => ''
);
 
$conn = get_conn($config);

// 把文件内容转16进制放入数据表
$file = 'abc.ods';
$type = explode('.',$file);
$type = $type[1];
$data = bin2hex(file_get_contents($file));

$sql = "insert into word(type,content) values('".$type."','".$data."')";
$stmt = $conn->prepare($sql);
$stmt->execute();

// 把文件内容读出,保存为文件
$sql = "select * from word";
$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->fetchall(PDO::FETCH_ASSOC);
foreach($result as $k=>$row){
    print_r($row);
    $filedata = pack('H*', $row['content']);
    file_put_contents(time().'.'.$row['type'], $filedata, true);
}

?>
谢谢大神,原因找到了,是数据库里面的十六进制数据不完整导致的,用PACK("H*",$data)。是可以解决的。分都给你了。
傲雪星枫 2017-01-14
  • 打赏
  • 举报
回复
可以看看转换的程序,就是把word转为你现在字段中内容的代码。 看看是怎样转的 图片是直接把二进制保存,所以可以直接读出显示。 你这个估计是经过一些处理的。
傲雪星枫 2017-01-14
  • 打赏
  • 举报
回复
测试了一下,可以把16进制的保存到db,然后读出生成文件。


CREATE TABLE `word` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(10) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1





<?php
function get_conn($config){

$dbhost = $config['host'];
$dbname = $config['dbname'];
$dbuser = $config['user'];
$dbpasswd = $config['password'];
$pconnect = $config['pconnect'];
$charset = $config['charset'];

$dsn = "mysql:host=$dbhost;dbname=$dbname;";
try {
$h_param = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);
if ($charset != '') {
$h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼
}
if ($pconnect) {
$h_param[PDO::ATTR_PERSISTENT] = true;
}
$conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);

} catch (PDOException $e) {
throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
}

return $conn;
}

$config = array(
'host' => 'localhost',
'dbname' => 'test',
'user' => 'root',
'password' => '',
'pconnect' => 0,
'charset' => ''
);

$conn = get_conn($config);

// 把文件内容转16进制放入数据表
$file = 'abc.ods';
$type = explode('.',$file);
$type = $type[1];
$data = bin2hex(file_get_contents($file));

$sql = "insert into word(type,content) values('".$type."','".$data."')";
$stmt = $conn->prepare($sql);
$stmt->execute();

// 把文件内容读出,保存为文件
$sql = "select * from word";
$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->fetchall(PDO::FETCH_ASSOC);
foreach($result as $k=>$row){
print_r($row);
$filedata = pack('H*', $row['content']);
file_put_contents(time().'.'.$row['type'], $filedata, true);
}

?>


傲雪星枫 2017-01-14
  • 打赏
  • 举报
回复
你数据库保存16进制的字段使用什么类型的?
h534450007 2017-01-13
  • 打赏
  • 举报
回复
引用 5 楼 fdipzone 的回复:
你是按完整代碼去測試嗎? 字段類型使用blob的。
你发的链接地址那篇文章核心代码就是header("Content-type: application/msword;"); echo $data;我之前试过了,不行。
h534450007 2017-01-13
  • 打赏
  • 举报
回复
引用 7 楼 h534450007 的回复:
[quote=引用 6 楼 xuzuning 的回复:]
如果这的是形如 0x....... 这样的串
$image = pack("H*", substr($data,2));

否则直接使用


这个我也使用过了。。[/quote]


h534450007 2017-01-13
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
如果这的是形如 0x....... 这样的串
$image = pack("H*", substr($data,2));
否则直接使用
这个我也使用过了。。
xuzuning 2017-01-13
  • 打赏
  • 举报
回复
如果这的是形如 0x....... 这样的串
$image = pack("H*", substr($data,2));

否则直接使用
傲雪星枫 2017-01-12
  • 打赏
  • 举报
回复
你是按完整代碼去測試嗎? 字段類型使用blob的。
h534450007 2017-01-12
  • 打赏
  • 举报
回复
引用 3 楼 fdipzone 的回复:
参考:http://blog.csdn.net/fdipzone/article/details/39915131?locationNum=4&fps=1
这个试过了,不行。。
h534450007 2017-01-11
  • 打赏
  • 举报
回复
别沉了。。。。。。。。。。。
h534450007 2017-01-11
  • 打赏
  • 举报
回复
自己顶一个。。。。。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧