Скачивание бинарных данных из БД MS SQL средствами php

271
04 декабря 2017, 18:03

Добрый день всем. Подсобите пожалуйста с вопросом, который пока не могу решить, поиск в интернете особо не дал ответа. Итак есть файлы, которые хранятся в БД MS SQL, в бинарном виде (поле blob). Задача простая, вывести для каждой статьи соответствующее приложение/приложения средствами php. Итак код, который дает мне какой-то результат.

try {
$db = new PDO("odbc:Driver={SQL Server Native Client 11.0};Server=SERVER;Database=mydb; Uid=user;Pwd=1admiN; charset=UTF-8");
    $sql = $db->query("SELECT TOP 1 id, name, ext, file FROM blob_files );
    $row = $sql->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOExeption $e){
    print "error". $e-> getMessage(). "<br/>";
    die();
}
foreach ($row as $key => $value) {
    $filename = $value[name];
    $f = fopen($filename, "w") or die ('Ошибка!');
    $file = fwrite($f, $value[file]);
//header("Content-Disposition: attacment; filename=$filename;");
header ("Location: " $filename);
exit(); }

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

Нашел в сети пример где вместо функции fopen(), используют функцию file_put_content(). Этой функцией получилось избавиться от первых пяти пустых строк, но увы файл также открывается как текст. Также пробовал все режимы для fopen(), не помогло.

Также на просторах вычитал, что MS SQL передает бинарные данные в кодировке ANSI и если надо передавать данные для UTF8, то писать при подключении надо в какой кодировке следует открывать соединение, но я в этом не разобрался, тем более, что название файлов на кириллице на скачку дает корректно, при этом если сделать var_dump($row)- результат выборки данных из БД, то там где русскоязычные названии, рисует знаки вопроса в ромбе )).

Короче вокруг одни вопросы, а ответа пока не видно, хотя задачка тревиальная. Скажу что проделывая дома, то же самое на MySQL, все работает как надо, в примитивном виде и даже если задать на выборку не 1 строки а 5, то скачивает все 5 файлов, а вот такой фокус на MS SQL не проходит.

READ ALSO
Передать адрес метода

Передать адрес метода

Необходимо передать адрес метода класса, не для вызова, а нужен лишь его адрес для отладки, преобразование в void*? Пишет что нельзя если метод...

283
Простой калькулятор c++

Простой калькулятор c++

Недавно начал изучать программирование, и решил начать с освоения c++Попытался создать простой калькулятор, но почему-то в командной строке...

373
c++ перегрузка операторов

c++ перегрузка операторов

я пишу класс для матрицы с такими функциями:

546
Конвертация unsighed char в char*;

Конвертация unsighed char в char*;

Надо представить десятичное число в unsigned char и реализовать операции сложениявычитания, умножения и деления

332