I am writing a PHP script that goes through a table and extracts 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With