Я работаю над приложением, которое использует данные со стороннего сервера (MS SQLSRV), к которому у меня есть только доступ для чтения.
Изображения на этом сервере хранятся как данные типа IMAGE. Я использую php (Laravel 5) в качестве бэкенда для внешнего интерфейса AngularJS для отображения изображений. Я не уверен, как поступить.
$students = DB::table('StudentImage')->where('STUDENTID', $id)->get();
$image = imagecreatefromstring($students[0]->IMAGE1); // unrecognized format error
Я также попробовал это:
$db = new PDO(...);
$stmt = $db->prepare("select IMAGE1 from [StudentImage] where [STUDENTID] = ?");
$stmt->execute([$id]);
$stmt->bindColumn('IMAGE1', $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
return response($lob, 200, ['Content-Type'=>'image/jpg']);
Все, что я получаю, это пустое изображение размером 20×20. Но я могу видеть изображение в Navicat (DB Admin Tool).
Как мне поступить?
После большого количества ударов головой я понял это. Оказывается, есть ограничение размера по умолчанию для «текстовых» полей в SQL Server. Все, что вам нужно сделать, это «сбросить» размер перед запуском SELECT
запрос, используя SET TEXTSIZE
команда:
<?php
DB::select('SET TEXTSIZE 10485760');
$students = DB::table('StudentImage')->where('STUDENTID', $id)->get();
$image = imagecreatefromstring($students[0]->IMAGE1);
?>
Это позволит установить максимальный размер 10 МБ, которого должно быть достаточно для отображения нужного вам изображения. Это, вероятно, то, что Navicat предварительно устанавливает перед выполнением запроса.
Других решений пока нет …