Добрый день всем. Подсобите пожалуйста с вопросом, который пока не могу решить, поиск в интернете особо не дал ответа. Итак есть файлы, которые хранятся в БД 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 не проходит.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Необходимо передать адрес метода класса, не для вызова, а нужен лишь его адрес для отладки, преобразование в void*? Пишет что нельзя если метод...
Недавно начал изучать программирование, и решил начать с освоения c++Попытался создать простой калькулятор, но почему-то в командной строке...
Надо представить десятичное число в unsigned char и реализовать операции сложениявычитания, умножения и деления