当我从 SQL 服务器数据库中提取二进制文件时,为什么我的所有图像都被截断了?
Why are all of my images getting cut off when I pull the binary out of a SQL Server DB?
我在 Amazon Linux AMI 上的 PHP 7 中使用 PDO 连接到 Amazon RDS 上的 SQL 服务器数据库 运行。
到目前为止,除了一列中的一列 table 之外,我已经能够很好地从数据库中提取所有数据。该列的类型为 image
,包含二进制数据。
当我尝试在 PHP 中使用 PDO 到 select 从有问题的列,然后将二进制文件输出到浏览器 window 并发送必要的 header (例如,header('Content-Type: image/jpeg');
),我只能看到文件的一部分(在图像的情况下)或出现 corrupt-file 错误(在 PDF 的情况下)。
在少数情况下(我假设文件非常小),我可以看到完整的图像,但这种情况很少见。
以下是 Chrome 中此问题的示例:
我在这个问题上做了一些相当广泛的谷歌搜索,但似乎没有很多关于这个问题的信息,而且我看到的所有页面都很旧并且与任何一个相关mssql
(在 PHP 7 中不再可用)或 sqlsrv
驱动程序。
以下是我发现的(看似)相关页面的一些示例:
- https://www.reddit.com/r/PHP/comments/m6v1t/need_help_displaying_jpg_from_mssql_image_field/
- https://css-tricks.com/forums/topic/blob-display-is-truncated/
- PHP is truncating MSSQL Blob data (4096b), even after setting INI values. Am I missing one?
有没有人知道为什么会发生这种情况以及我该如何解决?我觉得 PDO 应该可以处理这个问题,但是如果 PDO 有问题,我需要使用一些其他驱动程序来处理这个问题,那也没关系。
谢谢。
我终于找到了答案。通过 PDO 返回到 PHP 的数据实际上在 64k 处被截断,从而导致问题。
Alex 建议将 TEXTSIZE
设置为 -1
,帮助我走上了正确的道路。我犯的菜鸟错误是我从 Microsoft SSMS 中做了 SET TEXTSIZE -1
,假设它将为所有连接全局设置,但事实并非如此。它只为 SSMS 连接设置它,因此出现问题。
但是,当我最终在PHP中的PDO中进行了以下操作时,即使用PDO连接将TEXTSIZE
设置为-1
,然后从PDO进行查询时,我能够为 PDO 连接设置 TEXTSIZE
,然后取回所有数据:
doSqlServerQuery("SET TEXTSIZE -1;");
$results = doSqlServerQuery("SELECT binary-data-image-column AS data
FROM table-name
WHERE key = 95948578934578934;");
//Function definition
function doSqlServerQuery($query, $dbh = null) {
if (!isset($dbh)) {
global $dbh;
}
$stmt = $dbh->prepare($query);
if ($stmt) {
$stmt->execute();
$results = [];
while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
$results[] = $result;
}
return $results;
} else {
pO($dbh->errorInfo());
}
}
我自己解决了这个问题,它在上传 64KB 后被切断,要解决这个问题,要么将限制设置为 64KB,要么将其更改为 longblob,这将为您提供 4 GB 的存储空间而不是 64 KB。
我在 Amazon Linux AMI 上的 PHP 7 中使用 PDO 连接到 Amazon RDS 上的 SQL 服务器数据库 运行。
到目前为止,除了一列中的一列 table 之外,我已经能够很好地从数据库中提取所有数据。该列的类型为 image
,包含二进制数据。
当我尝试在 PHP 中使用 PDO 到 select 从有问题的列,然后将二进制文件输出到浏览器 window 并发送必要的 header (例如,header('Content-Type: image/jpeg');
),我只能看到文件的一部分(在图像的情况下)或出现 corrupt-file 错误(在 PDF 的情况下)。
在少数情况下(我假设文件非常小),我可以看到完整的图像,但这种情况很少见。
以下是 Chrome 中此问题的示例:
我在这个问题上做了一些相当广泛的谷歌搜索,但似乎没有很多关于这个问题的信息,而且我看到的所有页面都很旧并且与任何一个相关mssql
(在 PHP 7 中不再可用)或 sqlsrv
驱动程序。
以下是我发现的(看似)相关页面的一些示例:
- https://www.reddit.com/r/PHP/comments/m6v1t/need_help_displaying_jpg_from_mssql_image_field/
- https://css-tricks.com/forums/topic/blob-display-is-truncated/
- PHP is truncating MSSQL Blob data (4096b), even after setting INI values. Am I missing one?
有没有人知道为什么会发生这种情况以及我该如何解决?我觉得 PDO 应该可以处理这个问题,但是如果 PDO 有问题,我需要使用一些其他驱动程序来处理这个问题,那也没关系。
谢谢。
我终于找到了答案。通过 PDO 返回到 PHP 的数据实际上在 64k 处被截断,从而导致问题。
Alex 建议将 TEXTSIZE
设置为 -1
,帮助我走上了正确的道路。我犯的菜鸟错误是我从 Microsoft SSMS 中做了 SET TEXTSIZE -1
,假设它将为所有连接全局设置,但事实并非如此。它只为 SSMS 连接设置它,因此出现问题。
但是,当我最终在PHP中的PDO中进行了以下操作时,即使用PDO连接将TEXTSIZE
设置为-1
,然后从PDO进行查询时,我能够为 PDO 连接设置 TEXTSIZE
,然后取回所有数据:
doSqlServerQuery("SET TEXTSIZE -1;");
$results = doSqlServerQuery("SELECT binary-data-image-column AS data
FROM table-name
WHERE key = 95948578934578934;");
//Function definition
function doSqlServerQuery($query, $dbh = null) {
if (!isset($dbh)) {
global $dbh;
}
$stmt = $dbh->prepare($query);
if ($stmt) {
$stmt->execute();
$results = [];
while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
$results[] = $result;
}
return $results;
} else {
pO($dbh->errorInfo());
}
}
我自己解决了这个问题,它在上传 64KB 后被切断,要解决这个问题,要么将限制设置为 64KB,要么将其更改为 longblob,这将为您提供 4 GB 的存储空间而不是 64 KB。