2013-10-02 3 views
0

Предположим, что у меня есть некоторые капли из базы данных. Затем я поместил их в байтовые массивы. Например:Как я могу записать данные blob для zip и загрузить его на C#?

Byte[] lol1=(Byte[])reader["data1"]; 
Byte[] lol2=(Byte[])reader["data2"]; 

Теперь, как я могу записать эти массивы байтов в качестве файла в почтовый и загрузить его в файл из браузера в C#?

// Редактировать для ясности

Соответствующие коды в файле "Manager.cs", как:

public Byte[] FileDownload(string userName) 
    { 
     try 
     { 
      MySqlDataReader reader = new MySqlCommand("SELECT veri FROM veriler WHERE kullanici_id = (SELECT id FROM uyeler WHERE kullanici_adi='" + userName + "')", con).ExecuteReader(); 
      MemoryStream ms = new MemoryStream(); 
      GZipStream gzs = new GZipStream(ms, CompressionMode.Compress); 
      while (reader.Read()) 
       gzs.Write((Byte[])reader["veri"], 0, ((Byte[])reader["veri"]).Length); 
      return ms.ToArray(); 
     } 
     catch (Exception) 
     { 
      return Encoding.UTF8.GetBytes(string.Empty); 
     } 
    } 

соответствующие коды "DataDown.aspx.cs" файл, как:

protected void download_Click(object sender, EventArgs e) 
{ 
    Response.AddHeader("Content-type", ContentType); 
    Response.AddHeader("Content-Disposition", "attachment; filename=Archive.zip"); 
    Response.BinaryWrite(new Manager().FileDownload(Session["user"].ToString())); 
    Response.Flush(); 
    Response.End(); 
} 

Он возвращает .zip-файл, который является только файлом в нем. Это должно быть два файла. Более того, этот файл поврежден.

+0

Пробовали ли вы что-нибудь сделать? – Egor4eg

+0

Посмотрите на отредактированный вопрос. –

ответ

2

Для этого необходимо System.IO.Compression которое доступно только в .Net 4.5 вперёд.

string blobName = "data1"; 
string zipName = "database.zip"; 
Byte[] blob = (Byte[])reader[blobName]; 

using(MemoryStream zs = new MemoryStream()) 
{ 
    // Build the archive 
    using(System.IO.Compression.ZipArchive zipArchive = new ZipArchive(zs, ZipArchiveMode.Create, true)) 
    { 
    System.IO.Compression.ZipArchiveEntry archiveEntry = zipArchive.CreateEntry(blobName); 
    using(Stream entryStream = archiveEntry.Open()) 
    { 
     entryStream.Write(blob, 0/* offset */, blob.Length); 
    } 
    } 

    //Rewind the stream for reading to output. 
    zs.Seek(0,SeekOrigin.Begin); 

    // Write to output. 
    Response.Clear(); 
    Response.ContentType = "application/zip"; 
    Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", zipName)); 
    Response.BinaryWrite(zs.ToArray()); 
    Response.End(); 
} 

Если поставщик данных поддерживает открытие блоб как поток, вероятно, можно не читать запись в буфер, и вместо того, чтобы использовать Stream.CopyTo()

+0

Я использовал класс GZipStream. System.IO.Compression не имеет класса ZipArchiveEntry в моем компиляторе. Я использую MS Visual Studio 2012. Я предполагаю, что его версия фрейма .Net 4.5. Я редактировал свой вопрос. Вы можете посмотреть. Спасибо за ответ. –

+1

Он существует в .net 4.5. Просто убедитесь, что вы включили ссылку в System.IO.Compression.dll в свой проект. http://msdn.microsoft.com/ru-ru/library/system.io.compression.ziparchiveentry.aspx – Egor4eg

+0

Я добавил его, и ваш код работает для меня. Спасибо брат. –

Смежные вопросы