我有一个表,我将其称为table_x
,将文件附件作为Oracle数据库中的二进制大对象。
但是,每个文件没有一行,每28kb文件块有一行。每个blob永远不会超过28kb。
行可能看起来像:
attachsysfilename file_seq file_size file_data
blah.xlsx 0 12000 <BLOB>
poo.xlsx 0 28000 <BLOB>
poo.xlsx 1 9000 <BLOB>
没有行的文件大小&gt; 28000字节。每个attachsysfilename
和file_seq
组合都是唯一的。当一个文件超过28000字节时,它将被拆分为2行以上,具体取决于存储文件所需的28kb块。
如果我直接从数据库中导出blob,我需要在打开它们之前连接存储在2行以上的blob。例如,如果我下载了2份Excel文件,我必须在命令行上使用Windows(例如type part1.xlsx part2.xlsx > combined.xlsx
)来组合这些部分。组合文件将正常打开,但单独打开任一部分将返回错误。
我正在用PHP编写一些使用PDO访问这些数据的页面,并希望在代表同一文件时使用PHP类似地连接2+ blob。
编写页面以下载仅存储在一行(大小为28kb或更小)的文件时,我没有任何问题。我的工作原理如下:
$att = $cono -> prepare (" SELECT attachsysfilename,
file_size,
file_data
from table_x
where attachsysfilename = :file_id
");
$att -> bindParam(':file_id', $file_id, PDO::PARAM_STR);
$att -> execute();
$att -> bindColumn(1, $attachsysfilename, PDO::PARAM_STR, 256);
$att -> bindColumn(2, $file_size, PDO::PARAM_STR, 256);
$att -> bindColumn(3, $file_data, PDO::PARAM_LOB);
$att_row = $att -> fetch( PDO::FETCH_BOUND );
header("Content-type: application/vnd.openxmlfo");
header("Content-Disposition: inline; filename = $attachsysfilename");
fpassthru($file_data);
只要文件限制为表格的一行,上述工作就可以正常工作。
这是我在2行以上处理这些文件的最佳尝试:
$att = $cono -> prepare (" SELECT attachsysfilename,
file_size,
file_data
from table_x
where attachsysfilename = :file_id
");
$att -> bindParam(':file_id', $file_id, PDO::PARAM_STR);
$att -> execute();
$att -> bindColumn(1, $attachsysfilename, PDO::PARAM_STR, 256);
$att -> bindColumn(2, $file_size, PDO::PARAM_STR, 256);
$att -> bindColumn(3, $file_data, PDO::PARAM_LOB);
$combined_blob = '';
while ( $att_row = $att -> fetch( PDO::FETCH_BOUND ) )
{
$combined_blob = $combined_blob . $file_data;
}
header("Content-type: application/vnd.openxmlfo");
header("Content-Disposition: inline; filename = $attachsysfilename");
fpassthru($combined_blob);
?>
返回此错误(在下载的文件中):
<b>Warning</b>: fpassthru() expects parameter 1 to be resource, string given in ....
目标是将php中的2+ blob组合在一起,以便组合的blob可以作为文件下载,而不是任何一个部分。