Используя специальное приложение DevExpress, наши пользователи загружают PDF-файлы, которые сохраняются в столбце VARBINARY(MAX) в базе данных MSSQL 2008.
У меня есть LAMP box, который успешно подключается к этой базе данных с помощью драйвера FreeTDS.
Я могу извлекать другие типы информации (изображения, хранящиеся в виде больших двоичных объектов, дат, строк и т. д.), но когда я пытаюсь обслуживать PDF-файлы, они каким-то образом повреждаются.
Если я сравню файл перед загрузкой и после загрузки с помощью шестнадцатеричного редактора, я увижу, что они разные (строка в последующем снимке соответствует тому, что находится в базе данных 128B08...)
PHP, который я использую для обслуживания файла:
<?php
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type:application/pdf");
header("Content-Disposition:attachment;filename=" . $arr[0]['FileName']);
header("Content-Transfer-Encoding: binary");
echo $arr[0]['FileContent'];
С#, используемый для сохранения файла в БД:
public void LoadFromStream(string fileName, Stream stream)
{
Guard.ArgumentNotNull(stream, "stream");
Guard.ArgumentNotNullOrEmpty(fileName, "fileName");
FileName = fileName;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
Content = bytes;
}
public void SaveToStream(Stream stream)
{
if (string.IsNullOrEmpty(FileName))
{
throw new InvalidOperationException();
}
stream.Write(Content, 0, Size);
stream.Flush();
}
public byte[] Content
{
get { return GetDelayedPropertyValue<byte[]>("Content"); }
set
{
int oldSize = size;
if (value != null)
{
size = value.Length;
}
else
{
size = 0;
}
SetDelayedPropertyValue<byte[]>("Content", value);
OnChanged("Size", oldSize, size);
}
}
Я прочитал почти все статьи, которые смог найти, выполнив поиск «php varbinary, php output stream, php varbinary stream, varbinary encoding». Помощь или предложения очень ценятся!