我正在编写一个PHP脚本,该脚本通过一个表并将每个记录中的varbinary(max)
blob数据提取到外部文件中。代码工作正常(我使用几乎相同的代码来浏览一些图像),除非文件超过4096b - 数据被截断为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>");
}
}
?>
输出
尝试... projectPhotos / docs / file1.pdf 完成(4096)
尝试... projectPhotos / docs / file2.zip完成(4096)
尝试...... projectPhotos / docsv3.pdf完成(4096)
等。
答案 0 :(得分:12)
不要将odbc.defaultlrl
设置为0
,而是尝试将其设置为实际值:
ini_set("odbc.defaultlrl", "100K");
答案 1 :(得分:5)
如果您正在使用mssql(freetds),请在/etc/freetds.conf中查找名为&#34;文本大小&#34;的设置。我的设置为64512,这正是我的图像被截断的原因。我把它设置为5MB(5242880),它现在就像一个魅力。
text size = 5242880
答案 2 :(得分:1)
根据this comment in the manual,您必须在连接之前设置INI设置,这似乎不是您的情况。
答案 3 :(得分:1)
我知道这很古老,但我解决了这个问题。 ini_set不适用于mssql.textlimit或mssql.textsize,这在php.net上有记录。
这两个默认为php.ini文件中的4096b(4k)。将这些重置为更高的值,它将正常工作。
不要忘记重新启动httpd服务。