1

カスタム DevExpress アプリケーションを使用して、ユーザーは PDF ファイルをアップロードし、MSSQL 2008 データベースの VARBINARY(MAX) 列に保存されます。

FreeTDSドライバーを使用してそのデータベースに正常に接続するLAMPボックスがあります。

他の種類の情報 (ブロブ、日付、文字列などとして保存されている画像) を取得することはできますが、PDF を提供しようとすると、何らかの形で破損してしまいます。

16進エディタを使用してアップロード前とダウンロード後にファイルを比較すると、それらが異なることがわかります(アフターショットの文字列は、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

これにはいくつかの問題があります。

まず、データベースに保存されているデータは16進形式であるため、ユーザーに提供する前に、PHPコードでバイト配列に変換し直す必要があります。

次に、データベースにある16進数の表現が、使用しているPDFに対して正しくないようです。

PDFをバイト配列から16進表現に変換すると、非常に異なった外観の16進文字列が得られ、バイト配列に変換して戻すと正常に機能します。

于 2012-05-16T13:07:18.303 に答える