У меня есть изображения различных форматов (.png, .jpg, .bmp и т. Д.), Которые хранятся в виде сжатого текста в текстовом столбце таблицы SQL Server 2005. Мне нужно прочитать строку, разархивировать изображение и сохранить его в столбце изображения в другой таблице.
Я использую библиотеку 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 перед вставкой в таблицу. Похоже, что информация о формате была добавлена в начало данных перед вставкой.
Глядя на эти данные, сможет ли кто-нибудь понять, как эти данные изображения манипулировали? Опять же, мне нужно поместить несжатые данные изображения в столбец с типом данных, способствующим чтению, для отображения на веб-странице.
РЕДАКТИРОВАТЬ: Хорошо, я в тупике. Выполнение следующего кода приводит к ошибке «Не удалось преобразовать значение параметра из Int32 в байт []». Кажется, он помещает длину байтового массива в значение байтового массива ...
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();
}
}
}
Кажется, что он читает данные из столбца исходного текста просто отлично. Я просто не могу понять, как получить это в параметре типа изображения. Значение для переменной буфера показывает длину байтового массива, а не фактические байты. Может быть, именно это свойство значения обычно показывает для байтовых массивов? Я так близко и все же так далеко. : /
РЕДАКТИРОВАТЬ: Хорошо, я тупица. Я сделал следующее исправление, и оно работает!
zis.Read(buffer, 0, buffer.Length)
commandUncompressed.Parameters["@ImageContents"].Value = buffer;
На данный момент я могу обрабатывать только данные FORMAT-ZIPV3, так как я еще не понял, как декодировать строки FORMAT-ZIP2. Ниже приводится выборка данных V2. Если кто-нибудь сможет определить кодировку, дайте мне знать. Будет ли по-другому, если архив с использованием 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...