【问题标题】:Forced downloaded blob not correct format via PHP MYSQL通过 PHP MYSQL 强制下载的 blob 格式不正确
【发布时间】:2015-07-25 10:26:40
【问题描述】:

我已经设法将代码下载到保存在 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 文件内容的屏幕转储

【问题讨论】:

  • 我认为这个答案可能对你有帮助stackoverflow.com/questions/20556773/…
  • 谢谢 我试过 echo base64_encode($lob);在最后一行并添加了出口;还是不走运。
  • 不,我不是这个意思,我的意思是你应该在将文件写入数据库之前对文件进行base64编码。即:$file = base64_encode($_FILES['input_name'][tmp_name]);(虽然不是字面意思,显然你仍然应该做一些消毒)。然后你就可以echo base64_decode($lob);

标签: php mysql blob


【解决方案1】:

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

还要确保源中没有空格,因为这会破坏输出。

检查:

<-- Here
<?php

?>
<-- here

或者最好还是完全删除最后的结束 php 标签

【讨论】:

  • 感谢您的建议,不幸的是没有运气
【解决方案2】:

也许我的简单编码功能可以帮到你。正如@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="image/*" 和适合您需要的显示功能。

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2021-10-09
    • 2013-01-24
    • 1970-01-01
    • 2012-08-26
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多