我在保存/查看存储在MsSQL数据库中的PNG文件时遇到问题,如下所示:
我正在使用下一个代码来获取文件:
RelativeLayout
但是输出是一个在10%之后被“剪切”的图像......当从MsSQL中提取JPG图像时,这种行为不会发生...任何想法?
我尝试过使用while循环,但最终会出现一个巨大的文件,可能是因为它处于循环状态,直到服务器端限制开始(脚本执行时间等)。
function manualDIRECTimg(){
ini_set('mssql.textlimit', '100000000');
ini_set('mssql.timeout', '9999');
ini_set('mssql.compatability_mode', '1');
ini_set('mssql.textsize', '100000000');
set_time_limit(0);
header('Content-Type: image/png');
$codPRODUSerp = $_GET['id'];
$rowerp=mssql_fetch_array(mssql_query("EXECUTE spWEBSelectFoto ".$codPRODUSerp.", 1"));
$img=$rowerp['0']; // The image is stored in column0
if($img!=''){
global $defaultPRODUCTimagePATH;
$imagineprodusTMP = $defaultPRODUCTimagePATH.'_0_TMPzz.jpg';
$file = fopen( $imagineprodusTMP, "w" );
fwrite( $file, $img);
fclose( $file);
readfile($imagineprodusTMP);
unlink($imagineprodusTMP);
}else{echo "There's no image found in the database";}
}
即使我编码$ img字符串,我在尝试PNG图像时仍会得到相同的结果...... https://pastebin.com/ce6ndFai
JPG / JPEG图像再次正常...此问题仅在PNG上发生
P.S。实际文件如下: (一张OK拉出并保存的JPEG图片)
这不是kb neighter的原始(数据库)图像大小的问题,它的大小以像素为单位,我有一个小的500x500px和一个1000x1000px的PNG以相同的方式运作。我必须说,当使用它的实际软件正确输出时,存储的图像工作正常:
答案 0 :(得分:0)
你在这里遇到了一些问题,例如你使用全局变量和不推荐使用的数据库函数,以及不必要的繁琐的输出方法。以下是我将如何处理这个问题:
index.js
如果您的数据库需要超过默认脚本超时来获取一个图像, 用DB管理员提出来。用户不会等待一张图片60秒,禁用超时也不是一种合理的方法!
但绝对放弃那些旧的mssql函数。它们早已被弃用,甚至不存在于现代版本的PHP中。
答案 1 :(得分:0)
似乎这是一个关于SQL服务器如何提供数据的问题,我设法将一些代码更改为miken32的代码并努力实现:
function manualPDOdirectIMG() {
set_time_limit(0);
$codPRODUSerp = $_GET['id'];
$db = new PDO("dblib:host=xxx.xxx.xxx.xxx;dbname=DATABASE", "USER", "PWD");
$sql = "EXECUTE spWEBSelectFoto ".$codPRODUSerp.", 1";
$stmt = $db->prepare($sql);
$stmt->execute();
if ($img = $stmt->fetchColumn()) {
header("Content-Type: image/png");
echo $img;
return true;
}
return false;
}
和同样的" cut"图像结果......
感谢所有人的帮助,真是太棒了!就我的问题而言,答案是:
在这种情况下,它是远程MSSQL配置错误的问题。
答案 2 :(得分:0)
经过一段时间后,我发现了导致图像被截断的问题,在我的初步测试中,我使用了一个简单的
ini_set('mssql.textlimit','5242880'); ini_set('mssql.textsize','5242880');
没有产生任何影响,因此转移的数据在60KB后被截断...经过一些研究我发现手动设置
mssql_query(“SET TEXTSIZE 5242880”);
在实际的mssql_fetch_array查询之前,解决了我的问题! 从而指示MSSQL TEXTLIMIT& TEXTSIZE将被覆盖,确保在sql和php之间进行完整的数据传输
谢谢大家的智慧!