4

我正在编写一个 PHP 脚本,它遍历一个表并将varbinary(max)每条记录中的 blob 数据提取到一个外部文件中。代码运行良好(我使用几乎相同的代码浏览一些图像),除非文件超过 4096b - 数据在 4096 处被截断。

我已经修改了、 和的值mssql.textlimit,但没有成功。mssql.textsizeodbc.defaultlrl

我在这里错过了什么吗?

<?php 
 ini_set("mssql.textlimit" , "2147483647");
 ini_set("mssql.textsize" , "2147483647");
 ini_set("odbc.defaultlrl", "0");

 include_once('common.php'); //Connection to DB takes place here.
 $id=$_REQUEST['i'];
 $q = odbc_exec($connect, "Select id,filename,documentBin from Projectdocuments where id = $id"); 
 if (odbc_fetch_row($q)){

  echo "Trying $filename ... ";
  $fileName="projectPhotos/docs/".odbc_result($q,"filename");

  if (file_exists($fileName)){
   unlink($fileName);
  } 

     if($fh = fopen($fileName, "wb")) {
      $binData=odbc_result($q,"documentBin");
         fwrite($fh, $binData) ;
         fclose($fh);
         $size = filesize($fileName);
         echo ("$fileName<br />Done ($size)<br><br>");
     }else {
      echo ("$fileName Failed<br>");
     }
 } 
?>

输出

正在尝试... projectPhotos/docs/file1.pdf 完成 (4096)

正在尝试... projectPhotos/docs/file2.zip 完成 (4096)

正在尝试... projectPhotos/docsv3.pdf 完成 (4096)

ETC..

4

4 回答 4

14

不要设置odbc.defaultlrl0,而是尝试将其设置为实际值:

ini_set("odbc.defaultlrl", "100K");
于 2010-12-21T15:01:28.243 回答
5

如果您使用的是 mssql (freetds),请在 /etc/freetds.conf 中查找名为“文本大小”的设置。我的设置为 64512,这正是我的图像被截断的内容。我将它设置为 5MB (5242880),现在它的工作就像一个魅力。

text size = 5242880
于 2015-09-04T18:51:21.770 回答
1

根据手册中的此评论,您必须在连接之前设置 INI 设置,这似乎不是您的情况。

于 2010-12-21T14:59:03.543 回答
1

我知道这是古老的,但我以不同的方式解决了这个问题。ini_set 不适用于 mssql.textlimit 或 mssql.textsize,这在 php.net 上有记录。

在 php.ini 文件中,这两个默认为 4096b (4k)。将这些重置为更高的值,它将正常工作。

之后不要忘记重新启动 httpd 服务。

于 2013-04-19T17:04:54.687 回答