2014-11-03 85 views
1

我有没有办法处理blob(保存到mysql的文件)而不必创建文件?PHP在不创建文件的情况下处理blob

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

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

任何想法?

谢谢!

+0

是,不要创建文件。获取你的mysql字段的内容,并将适当的头添加到你的php中,并回应你的BLOB的内容。例如一个PNG图像:'header('Content-Length:'.strlen($ data)); header(“Content-type:image/png”); echo $ data;' – vaso123 2014-11-03 14:11:41

回答

2

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

#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"; 
} 
+0

嗨,谢谢你的回答。从blob中读取内容类型是否可行?它应该在第一口,应该不是吗? – leojg 2014-11-03 14:18:13

+0

这不太可能。你有一些函数存在这个purpouse:http://stackoverflow.com/questions/5304503/determinate-mime-type-from-mysql-column – dynamic 2014-11-03 14:24:35

+0

非常感谢,我会尝试! – leojg 2014-11-03 14:37:07

0

一种简单的方式来显示存储在你的数据库的内容是创建另一个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 peseudocode会是什么样子:

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

get_blob_content_type()回报像image/jpgget_blob()返回的实际内容。

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

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

(确保你没有报价在您的文件名!)

相关问题