通过PHP MYSQL强制下载的blob格式不正确

时间:2015-07-25 10:26:40

标签: php mysql blob

我已经设法将代码下载到mysql表中保存的中型blob。代码的工作方式是检索正确的文件,正确命名,给它正确的扩展名,浏览器强制下载它。

问题是当我尝试打开文件时出现错误。例如,如果它是图像将不显示的jpeg文件。如果是pdf,我不会得到pdf。我检查了文件大小,它似乎对应于存储的Blob文件大小。

我认为这是格式问题,但不知道如何纠正它。任何帮助赞赏。我的代码是:

Front End:
<a href="data/docmgmt/get-docmgmt.php?id=<?php=$id;?>">Test</a>

BackEnd:
$doc_id = 24122565639274498;
$conn = new PDO("mysql:host=localhost;dbname=$dbname", $db->id, $db->pass); //connect to db
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    //error modes                      
$stmt = $conn->prepare('SELECT content,type,name,size FROM docmgmt WHERE doc_id=:doc_id');
$stmt->bindParam(':doc_id', $doc_id, PDO::PARAM_INT);
$stmt->execute();               
$stmt->bindColumn(1, $lob, PDO::PARAM_LOB);
$stmt->bindColumn(2, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(3, $name, PDO::PARAM_STR, 256);
$stmt->bindColumn(4, $size, PDO::PARAM_INT);
$stmt->fetch(PDO::FETCH_BOUND);

header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $lob;

检索到的PNG文件内容的转储

enter image description here

2 个答案:

答案 0 :(得分:0)

这可能是某种编码问题我尝试对数据库进/出数据进行base64编码/解码

还要确保源中没有空格,否则会破坏输出。

检查:

<-- Here
<?php

?>
<-- here

或更好仍然完全删除最终结束的php标记

答案 1 :(得分:0)

也许我的简单编码功能可以帮到你。由于@andrew说它很可能不起作用,因为你没有使用base64编码/解码

发送类似

的文件
<input type="file" name="image" accept="image/*">


处理它

// Make sure the user uploaded a file
if (isset($_FILES['image']) && $_FILES['image']['size'] > 0) {

    // Temporary file name stored on the server
    $tmpName = $_FILES['image']['tmp_name'];

    // Read the file
    $fp = fopen($tmpName, 'r');
    $data = fread($fp, filesize($tmpName));
    $data = addslashes($data);
    fclose($fp);
}


将$ data存储在db中,然后使用

$img=base64_encode($row['image_from_db']);


将$ img放入显示功能

// Return <img> if there is any provided.
function displayImage(&$link){
   if(!empty($link)){
          return "<img alt=\"Profile Picture\" src=\"data:image/*;charset=utf8;base64, $link \">";
       }
       else
       {
          return "<img alt=\"Profile Picture\" src='../img/nopicture.jpg'>";
       }
 }


如果您需要其他文件而不是图像,则需要更改输入accept =&#34; image / *&#34;以及适合您需求的显示功能。