使用自定义DevExpress应用程序,我们的用户正在上传PDF文件,这些文件存储在MSSQL 2008数据库的VARBINARY(MAX)列中。
我有LAMP框,使用FreeTDS驱动程序成功连接到该数据库。
我能够检索其他类型的信息(存储为blob,日期,字符串等的图像)但是当我尝试提供PDF时,它们会以某种方式被破坏。
如果我在上传之前和使用十六进制编辑器下载之后对文件进行比较,我可以看到它们是不同的(后面的字符串与db 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'];
C#用于将文件保存到db:
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”来阅读我能找到的每篇文章。帮助或建议非常感谢!
答案 0 :(得分:2)
这有几个问题。
首先,存储在数据库中的数据是十六进制格式,因此在将其提供给用户之前,您需要将其转换回PHP代码中的字节数组。
其次,您在数据库中获得的十六进制重新生成对于您正在使用的PDF似乎不正确。
当我将PDF从字节数组转换为十六进制重新生成时,我得到了一个非常不同的十六进制字符串,当转换回字节数组时,工作正常。