使用php / html显示mysql blob图像

After two days of search I come here with the hope of finding a solution.

I am actually trying to store files in the database (mysql), I know how bad it is, but we actually need to do a footprint of the application, so we can't store them with the sources.

I use 3 files:

  • my form (classic html/php file)
  • a php file who process data from form in order to put them into the DB
  • another php file in order to get an image from the DB, sending a ID with GET

The problem is that I can't display my image.

the form->

<?php
    echo ('<img src="profil_pic_display.php?uid_owner=' . $dCookie['uid']. '">'); //The display line
    ?>
    <form method="POST" action="upload_profil_pic.php" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="250000"/>
        Selectionnez une photo: <input type="file" name="avatar"/>
        <br/>
        <br/>
        <input class="ui-button" type="submit" value="Envoyer"/>
        <span><small>Formats acc&eacute;pt&eacute;s: .png/.jpeg/.jpg/.gif | Taille max: 250ko</small></span>
    </form>

Where the data form the form are processed->

<?php
require_once ('bdd.php');
require_once ('cookie.php');

$dCookie = check_cookie(1);
$maxSize = 250000;
$extensions = array('.png', '.gif', '.jpg', '.jpeg');

// On verifit que le transfert s'est bien deroule et donc que l'image est bien stocke     en tmp
if (!isset($_FILES['avatar']) || !is_uploaded_file($_FILES['avatar']['tmp_name'])) {
    echo('Probleme de transfert');
    die();
}    

$pData = $_FILES['avatar'];
$pName = basename($pData['name']);
$pType = $pData['type'];
$pSize = filesize($pData['tmp_name']);

// Verification de l'extension et de la taille
if (!in_array(strrchr($pName, '.'), $extensions) || ($pSize > $maxSize)) {
    echo('Fichier non valide.');
    die();
}
// anihilation des ' ' et des accents.
$pName = strtr($pName, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',      'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$pName = preg_replace('/([^.a-z0-9]+)/i', '_', $pName);

//avant d'uplaoder une nouvelle image on supprime l'ancienne si il y a (en fonction de l'uid_owner
$reqCheckOldPic = $GLOBALS['bdd']->prepare('DELETE FROM num_profil_picture WHERE uid_owner   = :uid_owner;');
$reqCheckOldPic->bindParam(':uid_owner', $dCookie['uid']);
__log($dCookie['uid'], 'DELETE', array('QUERY' => $reqCheckOldPic->queryString, 'VALUE' =>    array(':uid_owner' => $dCookie['uid'])));
$reqCheckOldPic->execute();
$reqCheckOldPic->closeCursor();

// On prepare l'upload / recuperation du contenu binaire ET echappement du contenu binaire
$pBlob = file_get_contents($pData['tmp_name']);
$reqUpload = $GLOBALS['bdd']->prepare('INSERT INTO num_profil_picture (uid_owner,
                                                                    img_nom,
                                                                    img_taille,
                                                                    img_type,
                                                                    img_blob)
                                                            VALUE (:uid_owner,
                                                                    :img_nom,
                                                                    :img_taille,
                                                                    :img_type,
                                                                       :img_blob);');
$reqUpload->bindParam(':uid_owner', $dCookie['uid']);
$reqUpload->bindParam(':img_nom', $pName);
$reqUpload->bindParam(':img_taille', $pSize);
$reqUpload->bindParam(':img_type', $pType);
$reqUpload->bindParam(':img_blob', addslashes($pBlob));
__log($dCookie['uid'], 'INSERT', array('QUERY' => $reqUpload->queryString,
'VALUE' => array(
    ':uid_owner' => $dCookie['uid'],
    ':img_nom' => $pName,
    ':img_taille' => $pSize,
    ':img_type' => $pType,
        ':img_blob' => $pBlob)));
$reqUpload->execute();
$reqUpload->closeCursor();
header("Content-type: " . $pType);
echo ($pBlob);
?>

And here it is the display->

<?php

require_once('bdd.php');
require_once('cookie.php');


$reqGetPic = $GLOBALS['bdd']->prepare('SELECT img_type, img_blob FROM num_profil_picture WHERE uid_owner = :uid_owner;');
$reqGetPic->bindParam(':uid_owner', $_GET['uid_owner']);
$reqGetPic->execute();
$pic = $reqGetPic->fetch();

header("Content-type: " . $pic[0]);
header('Content-transfer-encoding: binary');
echo ($pic[1]);
?>
douqiao6563
douqiao6563 好的,我发现了解决方案,使用数据URI。如果您遇到麻烦,请访问此处获取更多信息!stackoverflow.com/a/2070625/1585121祝你有个美好的一天。
大约 8 年之前 回复
dongya4335
dongya4335 好的,我刚刚从mysqlDB下载了blob文件,和原来的一样。所以问题出现在显示过程中。我不认为它来自我的PDO查询。也许形成标题,但MIME类型是好的,我检查了它。那么也许它来自echo()?
大约 8 年之前 回复
dongliang_bj2016
dongliang_bj2016 还试图改变Mysql表中的类型,但varchar/blob/binary/text总是给出相同的结果。
大约 8 年之前 回复
douruoshen1449
douruoshen1449 好吧,我实验了一下,改变了addslashes()/fil_get_content()或freadparams,这里的第一行结果:original->justbeamit.com/4c21afile_get_content+addslashes->justbeamit.com/5f23bjustfile_get_content,noaddslashes->justbeamit.com/36586与file_get_content或fread完全相同的结果。没有get_file_content或fread,它只返回文件路径,如预期的那样。
大约 8 年之前 回复
douqian2957
douqian2957 也许差异可以来自在将blob放入数据库之前的addslashes(),还是来自函数file_get_content()?只是问,我有没有测试,没有变化。原始文件大小:42,6Ko(43687八位字节)Uplaoded文件大小:43,4Ko(44668八位字节)
大约 8 年之前 回复
ds34222222
ds34222222 但是在我主页面的主文件中,我用这个回声调用了我的图像('<imgsrc=“profil_pic_display.php?uidowner='。$_Cookie['uid']。'”>');
大约 8 年之前 回复
dongruolin5324
dongruolin5324 好的,当我打开两个文件(原始图像/上传的图像)时,长度有一点不同:d这可以来自何处?
大约 8 年之前 回复
dpylt7626401
dpylt7626401 我做了image.png的事情,但没有显示,我不知道它是正常还是奇怪。我将尝试比较它们。<br/>是的,我在图片中有一个valideMIME类型,它包含'image/jpeg',当我上传一个jpg或jpeg例如
大约 8 年之前 回复
dse3168
dse3168 二进制数据的原始页面很好。查看源代码,将其复制并粘贴到基本文本编辑器中,然后另存为原始文件(即image.png),然后在图像查看器中查看。这应测试您的标头是否不正确。您也可以根据原件进行检查(在BASIC文本编辑器中打开)
大约 8 年之前 回复
dongyong8071
dongyong8071 此外,您确定显示文件没有发送前导或尾随空格吗?
大约 8 年之前 回复
drf97973
drf97973 你检查过发送的标题了吗?你确定$pic[0]包含有效的MIME类型吗?
大约 8 年之前 回复
duancunsu9209
duancunsu9209 这在我看来是可以的,因为BLOB是BINARYLARGEOBJ
大约 8 年之前 回复
dtbrd80422
dtbrd80422 如果我评论它们我得到了二进制数据的原始页面
大约 8 年之前 回复
doukucai0099
doukucai0099 首先尝试注释掉标题以查看数据是否正常返回,或者是否正在生成其他输出
大约 8 年之前 回复

1个回答



好的,我找到了解决方案,使用数据URI。 如果遇到麻烦,请访问此处获取更多信息: php:从二进制数据中重新创建并显示图像。 </ p>
</ div>

展开原文

原文

Ok i found out the solution, using data URI. If you are in trouble, go here for more info: php: recreate and display an image from binary data.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐