Почему все мои изображения обрезаются, когда я вынимаю двоичный файл из базы данных SQL Server?

Я использую PDO в PHP 7 на Amazon Linux AMI для подключения к базе данных SQL Server, работающей на Amazon RDS.

До сих пор я был в состоянии извлечь все данные из БД просто отлично, за исключением одного столбца в одной таблице. Столбец имеет тип image и содержит двоичные данные.

Когда я пытаюсь использовать PDO в PHP, чтобы выбрать из рассматриваемого столбца, а затем вывести двоичный файл в окно браузера с отправленным необходимым заголовком (например, header('Content-Type: image/jpeg');), Я вижу только часть файла (в случае изображения) или получаю ошибку поврежденного файла (в случае PDF).

В нескольких крайних случаях (я полагаю, когда размер файла довольно мал), я вижу полное изображение, но это редко.

Ниже приведен пример этой проблемы в Chrome:

введите описание изображения здесь

Я сделал довольно обширный поиск по этому вопросу, но, похоже, информации по этому вопросу не так много, и все страницы, которые я видел, довольно старые и имеют отношение к mssql (больше не доступно в PHP 7) или sqlsrv водители.

Вот несколько примеров (казалось бы) связанных страниц, которые я нашел:

У кого-нибудь есть идеи относительно того, почему это происходит и как я могу это исправить? Я чувствую, что PDO должен справиться с этим, но если есть проблема с PDO, и мне нужно использовать некоторые другие драйверы, чтобы справиться с этим, это тоже хорошо.

Спасибо.

1

Решение

Я наконец нашел ответ. Данные, возвращаемые в PHP через PDO, на самом деле усекались до 64 Кб, что вызывало проблемы.

Алекс помог привести меня на правильный путь, предложив настройку TEXTSIZE в -1, Ошибка новичка, которую я сделал, состояла в том, что я сделал SET TEXTSIZE -1 от Microsoft SSMS, предполагая, что он будет установлен глобально для всех соединений, что было не так. Это только установить его для соединения SSMS, таким образом, проблема.

Однако когда я наконец сделал следующее в PDO в PHP, то есть установил TEXTSIZE в -1 с подключением PDO, а затем сделать запрос из PDO, я смог установить TEXTSIZE для подключения PDO, а затем получить обратно все данные:

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());
}
}
3

Другие решения

Просто исправьте это самостоятельно, оно отключается после загрузки 64 КБ, чтобы исправить это, либо установите ограничение в 64 КБ, либо измените его на longblob, который дает вам 4 гигабайта памяти вместо 64 килобайт.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector