1

使用自定义 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#:

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 输出流、php varbinary 流、varbinary 编码”,我已经阅读了几乎所有可以找到的文章。非常感谢帮助或建议!

4

1 回答 1

2

这有几个问题。

首先,存储在数据库中的数据是十六进制格式的,因此您需要在将其提供给用户之前将其转换回 PHP 代码中的字节数组。

其次,您在数据库中获得的十六进制表示对于您正在使用的 PDF 似乎不正确。

当我将 PDF 从字节数组转换为十六进制表示时,我得到了一个非常不同的十六进制字符串,当转换回字节数组时,它工作正常。

于 2012-05-16T13:07:18.303 回答