【问题标题】:PHP batch extract DB row BLOBs to filesPHP批量提取数据库行BLOB到文件
【发布时间】:2011-09-17 05:50:08
【问题描述】:

我们正在进行数据迁移,项目需要从一个特定的表中将 BLOB 数据保存到文件中,并发送给供应商,因为它们的结构

我可以一次完成这个,但需要创建一个批处理,因为有 50,000 行/潜在文件。

我当前的代码是

 $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_BLOW'] 写入文件。

标签: php oracle file blob


【解决方案1】:

代替:

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);

【讨论】:

  • 感谢您的指导,根据您的帮助用我的解决方案更新了我的原始问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多