我们正在进行数据迁移,由于其结构,项目需要从一个特定的表BLOB数据保存到文件中并发送给供应商
我可以一次实现这一点,但需要创建一个批处理过程,因为有50000行/潜在文件。
我当前的代码是
$sql = "SELECT a.guid AS file_name, a.attachment AS file_blob"
." FROM attachment a";
$squery = oci_parse($link, $sql);
oci_execute($squery);
while ($row = oci_fetch_array($squery, OCI_ASSOC | OCI_RETURN_LOBS)) {
header('Content-type: octet-stream;');
header('Content-disposition: attachment;filename='.$row['FILE_NAME']);
print $row['FILE_BLOB'];
}
oci_free_statement($squery);
我确实明白,我宁愿保存数据,也不愿将其流式传输到浏览器,我只是没有考虑如何实现这一点,我应该看看php文件I/O fputs()吗?
最终的结果是,我希望该过程基于对文件夹的查询批量写入二进制文件
编辑
感谢你的指导和帮助,基于此,我最终想出了两种不同的方法来实现这一目标首先,我执行了以下getcwd()来验证服务器指向的位置,并在需要时执行绝对路径
$basedir = '/path/to/host/www/blobdoc/';
设置blobdoc文件夹的权限,然后在while循环中使用以下任一脚本
$filename='';
$filename=$basedir.$row['FILE_NAME'];
file_put_contents( $filename, $row['FILE_BLOB']);
$filename='';
$filename=$basedir.$row['FILE_NAME'];
$File = @fopen( $filename, 'w' );
if( $File ) {
if( FALSE === fwrite( $File, $row['FILE_BLOB'] ))
return FALSE;
fclose( $File );
return TRUE;
}
代替:
print $row['FILE_BLOB'];
使用类似的东西
file_put_contents( $filename, $row['FILE_BLOB']); //save locally
您需要将blob写入文件。
如果你想强制下载该文件,那么你需要将正确的标题与readfile结合使用,比如:
$file = '/var/www/html/file-to-download.zip';
header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Length: ' . filesize($filename));
header('Content-Disposition: attachment; filename=' . basename($file));
readfile($file);