我有没有办法处理blob(保存到mysql的文件)而不必创建文件?PHP在不创建文件的情况下处理blob
我需要从数据库中检索一个blob,它可以是任何类型的文件,img,文本,视频等,并且能够在html中显示它。
到目前为止,我设法做的是创建一个文件并使用它。但是这有一个小问题,那就是我必须在用户停止使用该文件后将其删除。但是我不能在一段时间后创建一个cronjob(或者simillar)来删除这些文件。
任何想法?
谢谢!
我有没有办法处理blob(保存到mysql的文件)而不必创建文件?PHP在不创建文件的情况下处理blob
我需要从数据库中检索一个blob,它可以是任何类型的文件,img,文本,视频等,并且能够在html中显示它。
到目前为止,我设法做的是创建一个文件并使用它。但是这有一个小问题,那就是我必须在用户停止使用该文件后将其删除。但是我不能在一段时间后创建一个cronjob(或者simillar)来删除这些文件。
任何想法?
谢谢!
您可以使用脚本从数据库中即时打印文件的内容。 您只需存储其内容类型并从数据库中检索内容即可。
#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";
}
一种简单的方式来显示存储在你的数据库的内容是创建另一个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/jpg
和get_blob()
返回的实际内容。
奖励概念:如果您的blob具有关联的文件名(例如,您将blob与其原始文件名一起存储,例如cat.jpg
),则可以将其指定给浏览器,因此如果用户右键单击并选择保存,他们将获得原始文件名称。所有您需要做的是echo
语句之前添加以下代码:
header('Content-Disposition: inline; filename="' . get_blob_file_name($id) ."');
(确保你没有报价在您的文件名!)
是,不要创建文件。获取你的mysql字段的内容,并将适当的头添加到你的php中,并回应你的BLOB的内容。例如一个PNG图像:'header('Content-Length:'.strlen($ data)); header(“Content-type:image/png”); echo $ data;' – vaso123 2014-11-03 14:11:41