PHP将DB行BLOB批量提取到文件中



我们正在进行数据迁移,由于其结构,项目需要从一个特定的表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);

相关内容

  • 没有找到相关文章

最新更新