从MSSQL数据库处理PNG图像时出现问题

时间:2017-08-21 16:05:40

标签: php sql-server

我在保存/查看存储在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。实际文件如下: enter image description here(一张OK拉出并保存的JPEG图片)

enter image description here(BAD PNG ...)

这不是kb neighter的原始(数据库)图像大小的问题,它的大小以像素为单位,我有一个小的500x500px和一个1000x1000px的PNG以相同的方式运作。我必须说,当使用它的实际软件正确输出时,存储的图像工作正常: enter image description here

3 个答案:

答案 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之间进行完整的数据传输

谢谢大家的智慧!