PHP is truncating MSSQL Blob data (4096b), even after setting INI values. Am I missing one?
I am writing a PHP script that goes through a table and ext开发者_如何学Pythonracts the varbinary(max)
blob data from each record into an external file. The code is working perfectly (I used virtually the same code to go through some images) except when a file is over 4096b - the data is truncated at exactly 4096.
I've modified the values for mssql.textlimit
, mssql.textsize
, and odbc.defaultlrl
without any success.
Am I missing something here?
<?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
Trying ... projectPhotos/docs/file1.pdf Done (4096)
Trying ... projectPhotos/docs/file2.zip Done (4096)
Trying ... projectPhotos/docsv3.pdf Done (4096)
etc..
Instead of setting odbc.defaultlrl
to 0
, try setting it to an actual value instead:
ini_set("odbc.defaultlrl", "100K");
If you're using mssql (freetds), look in /etc/freetds.conf for a setting called "text size". Mine was set to 64512 and that's exactly what my images were being truncated to. I set it to 5MB (5242880) and it's working like a charm now.
text size = 5242880
According to this comment in the manual, you must set the INI settings before connecting, which does not seem to be your case.
I know this is ancient, but I solved this differently. ini_set does not wok for mssql.textlimit or mssql.textsize, this is documented on php.net.
Both of these default to 4096b (4k) in the php.ini file. Reset these to a higher value and it will work fine.
Dont forget to restart httpd service after.
精彩评论