【问题标题】:PHP handle a blob without creating a filePHP 在不创建文件的情况下处理 blob
【发布时间】:2014-12-30 04:56:36
【问题描述】:

我有办法处理 blob(保存到 mysql 的文件)而无需创建文件吗?

我需要从数据库中检索一个 blob,它可以是任何类型的文件、img、文本、视频等,并且能够在 html 中显示。

到目前为止,我设法做的是创建一个文件并使用它。但这有一个小问题,我必须在用户停止使用该文件后将其删除。但是一段时间后我无法创建一个 cronjob(或类似的东西)来删除这些文件。

有什么想法吗?

谢谢!

【问题讨论】:

  • 是的,不要创建文件。获取您的 mysql 字段的内容,并将正确的标头添加到您的 php 中,并回显您的 BLOB 的内容。例如一张 png 图片:header('Content-Length: '.strlen($data)); header("Content-type: image/png"); echo $data;

标签: php mysql


【解决方案1】:

您可以使用脚本从数据库中即时打印文件的内容。 您所要做的就是存储其内容类型并从数据库中检索内容。

#showFile.php
$contenttype = ... // retrive content type from database
$blob = ...  // retrive blob from database

header('Content-type: ' . $contenttype);
echo $blob;

如果您的数据库中没有保存 MIME 类型,您可以试试这个:Determinate mime type from MySQL column

function mimetype($data)
{
    //File signatures with their associated mime type
    $Types = array(
    "474946383761"=>"image/gif",                        //GIF87a type gif
    "474946383961"=>"image/gif",                        //GIF89a type gif
    "89504E470D0A1A0A"=>"image/png",
    "FFD8FFE0"=>"image/jpeg",                           //JFIF jpeg
    "FFD8FFE1"=>"image/jpeg",                           //EXIF jpeg
    "FFD8FFE8"=>"image/jpeg",                           //SPIFF jpeg
    "25504446"=>"application/pdf",
    "377ABCAF271C"=>"application/zip",                  //7-Zip zip file
    "504B0304"=>"application/zip",                      //PK Zip file ( could also match other file types like docx, jar, etc )
    );

    $Signature = substr($data,0,60); //get first 60 bytes shouldnt need more then that to determine signature
    $Signature = array_shift(unpack("H*",$Signature)); //String representation of the hex values

    foreach($Types as $MagicNumber => $Mime)
    {
        if( stripos($Signature,$MagicNumber) === 0 )
            return $Mime;  
    }

    //Return octet-stream (binary content type) if no signature is found
    return "application/octet-stream"; 
}

【讨论】:

  • 您好,感谢您的回答。是否可以从 blob 中读取内容类型?它应该在第一口,不是吗?
  • 这不太可能。 Alto 您为此目的存在一些功能:stackoverflow.com/questions/5304503/…
  • 非常感谢,我会试试的!
【解决方案2】:

显示存储在数据库中的内容的一种简单方法是创建另一个 PHP 脚本,例如 show_content.php。

从您的 HTML 中,您可以执行以下操作:

<img src="show_content.php?id=444" />

这将使用 $_GET['id'] === '444' 调用您的脚本

在脚本中,假设您有一个名为get_blob($id)get_blob_content_type($id) 的函数。您在 show_content.php 中的伪代码如下所示:

header('Content-Type: ' . get_blob_content_type($id), true);
echo get_blob($id);

get_blob_content_type() 返回类似 image/jpg 的内容,get_blob() 返回实际内容。

奖励概念:如果您的 blob 具有关联的文件名(例如,您将 blob 与其原始文件名一起存储,例如 cat.jpg),您可以将其指定给浏览器,因此如果用户右键单击并选择保存,他们将获得原始文件名。您所要做的就是在echo 语句之前添加以下代码:

header('Content-Disposition: inline; filename="' . get_blob_file_name($id) ."');

(确保文件名中没有引号!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多