さまざまな形式(.png、.jpg、.bmpなど)の画像が、SQLServer2005テーブルのテキスト列に圧縮テキストとして保存されています。行を読み取り、画像を解凍して、別のテーブルの画像列に保存する必要があります。
私はSharpZipライブラリを使用していますが、すべての例でファイルのソースと宛先を扱っています。変数から別の変数への解凍をカバーするものが見つかりません。これを説明するコードスニペットまたは関連するリソースへのリンクをいただければ幸いです。
編集:もう少し情報-データはTEXT列に保存されます。次のように表示されます(表示のためにテキスト列が省略されています)。
ImageID ImageData
1 FORMAT-ZIPV3 UEsDBBQAAAAIAOV6wzxdTnDvshs...
2 FORMAT-ZIPV3 UEsDBBQAAAAIAAF2yjxGncjOLgA...
3 FORMAT-ZIPV3 UEsDBBQAAAAIAKd6yjyjnQNr6gg...
4 FORMAT-ZIPV3 UEsDBBQAAAAIALdNyzyrPC8EMJw...
5 FORMAT-ZIPV3 UEsDBBQAAAAIAA1rOD1nZY1t0f0...
6 FORMAT-ZIPV3 UEsDBBQAAAAIANZplj2seyJ+VmM...
7 FORMAT-ZIPV3 UEsDBBQAAAAIAC5vhD27LPbPcv8...
8 FORMAT-ZIPV3 UEsDBBQAAAAIAK1qKz5DJNH3xMg...
9 FORMAT-ZIPV3 UEsDBBQAAAAIAHVkEztC3th/9hs...
10 FORMAT-ZIPV3 UEsDBBQAAAAIAEtXKz7DXHUdvow...
私が確かに知っているのは、画像がテーブルに挿入される前に、SharpZipを使用してプロセスのある時点で圧縮されたことです。挿入前にデータの先頭にフォーマット情報が追加されたようです。
このデータを見て、この画像データがどのように操作されたかについて誰かが洞察を持っていますか?繰り返しになりますが、非圧縮の画像データを、Webページに表示するために読み取るのに役立つデータ型の列に入れる必要があります。
編集:わかりました、私は困惑しています。次のコードを実行すると、「パラメータ値をInt32からByte[]に変換できませんでした」というエラーが発生します。バイト配列の長さをバイト配列の値に入れているようです...
commandUncompressed.Connection = connectionUncompressed;
commandUncompressed.Parameters.Add("@Image_k", SqlDbType.VarChar, 10);
commandUncompressed.Parameters.Add("@ImageContents", SqlDbType.Image);
commandUncompressed.CommandText = sqlSaveImage;
connectionUncompressed.Open();
reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine(reader["Image_k"].ToString()); // Merely for testing
String format = reader["ImageContents_Compressed"].ToString().Substring(0, 12);
var offset = 13; //"FORMAT-ZIPV3 ".Length;
var s = reader["ImageContents_Compressed"].ToString().Substring(offset);
var bytes = Convert.FromBase64String(s);
if (format == "FORMAT-ZIPV2 ")
{
bytes = ConvertStringToBytes(s); // Not a Base-64 encoded string? External conversion function utilized.
}
using (var zis = new ZipInputStream(new MemoryStream(bytes)))
{
ZipEntry zipEntry = zis.GetNextEntry(); // Doesn't seem to work unless an entry has been referenced
byte[] buffer = new byte[zis.Length];
commandUncompressed.Parameters["@Image_k"].Value = reader["Image_k"].ToString();
commandUncompressed.Parameters["@ImageContents"].Value = zis.Read(buffer, 0, buffer.Length);
commandUncompressed.ExecuteNonQuery();
}
}
}
ソーステキスト列からデータを正常に読み取っているようです。それを画像タイプパラメータに取り込む方法がわかりません。バッファ変数の値は、実際のバイトではなく、バイト配列の長さを示します。たぶんそれは、valueプロパティがバイト配列に対して通常表示するものですか?私はとても近くにいますが、まだ遠くにいます。:/
編集:わかりました、私はナックルヘッドです。私は次の修正を行いました、そしてそれはうまくいきます!
zis.Read(buffer, 0, buffer.Length)
commandUncompressed.Parameters["@ImageContents"].Value = buffer;
FORMAT-ZIP2文字列をデコードする方法がまだわからないため、現時点ではFORMAT-ZIPV3データしか処理できません。以下は、V2データのサンプルです。誰かがエンコーディングを決定できる場合は、私に知らせてください。ZIP形式の代わりにBZIPを使用してzip圧縮した場合は異なりますか?
ImageID ImageData
1 FORMAT-ZIPV2 504B03041400020008005157422A2E25FDBAF26701008D6901000E...
2 FORMAT-ZIPV2 504B03041400020008009159422A7FC94BA2B2540500D35705000E...
3 FORMAT-ZIPV2 504B0304140002000800685A422A0CAA51F4473A0600B97206000E...
4 FORMAT-ZIPV2 504B03041400020008001D5D422A770BD3ED201902002C4A02000E...
5 FORMAT-ZIPV2 504B0304140002000800325E422A4B6C2FB4045001001C6E01000E...
6 FORMAT-ZIPV2 504B03041400020008006F72422A5F793AC1A1F00200ECF302000E...
7 FORMAT-ZIPV2 504B0304140002000800D572422A1B348A731DE5000085EB00000E...
8 FORMAT-ZIPV2 504B03041400020008003D73422A8AEBB7F855640300DD1B04000E...
9 FORMAT-ZIPV2 504B03041400020008006368D528C5D0A6BA794900004A2502000E...
10 FORMAT-ZIPV2 504B03041400020008008E5B6C2A2D9E9C33D7AF05005CEC05000E...