PHP обрезает данные MSSQL Blob (4096b) даже после установки значений INI.Я скучаю по одному? - PullRequest
4 голосов
/ 21 декабря 2010

Я пишу скрипт PHP, который проходит через таблицу и извлекает данные BLOB-объекта varbinary(max) из каждой записи во внешний файл. Код работает отлично (я использовал практически один и тот же код для просмотра некоторых изображений), за исключением случаев, когда размер файла превышает 4096 байт - данные усекаются ровно с 4096.

Я изменил значения для mssql.textlimit, mssql.textsize и odbc.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>");
     }
 } 
?>

OUTPUT

Попытка ... projectPhotos / docs / file1.pdf Готово (4096)

Попытка ... projectPhotos / docs / file2.zip Готово (4096)

Пытаюсь ... projectPhotos / docsv3.pdf Готово (4096)

и т.д .. * * 1023

Ответы [ 4 ]

13 голосов
/ 21 декабря 2010

Вместо установки odbc.defaultlrl на 0, попробуйте вместо этого установить фактическое значение:

ini_set("odbc.defaultlrl", "100K");
5 голосов
/ 04 сентября 2015

Если вы используете mssql (freetds), посмотрите в /etc/freetds.conf параметр, называемый «размер текста». У меня было установлено значение 64512, и именно к этому были усечены мои изображения. Я установил его на 5 МБ (5242880), и теперь он работает как шарм.

text size = 5242880
1 голос
/ 19 апреля 2013

Я знаю, что это древний, но я решил это по-другому. ini_set не работает для mssql.textlimit или mssql.textsize, это задокументировано на php.net.

Оба эти значения по умолчанию равны 4096b (4k) в файле php.ini. Сбросьте их до более высокого значения, и оно будет работать нормально.

Не забудьте перезапустить службу httpd после.

1 голос
/ 21 декабря 2010

Согласно этому комментарию в руководстве , вы должны установить настройки INI перед подключением , что, похоже, не ваш случай.

...