2016-08-16 2 views
0

Я создал онлайн-портал для поставщиков HTML5, где они могут загружать и загружать столько файлов, сколько захотят. К сожалению, я не могу показать вам скриншоты. Но вот проблема: Если загружено 2 или более файлов, программа должна создать ZIP-файл со всеми PDF-файлами внутри. Он создается правильно и файлы находятся внутри, , но они повреждены, значит я не могу их открыть. Кроме того, они получили размер файла 1 КБ.Загруженные файлы PDF в .zip повреждены

String zipFile = String.Format(@"{0}.zip", Guid.NewGuid()); 
String zipPath = String.Format(@"{0}\{1}", Data.Properties.Settings.Default.DownloadPath, zipFile); 


using (FileStream zipToOpen = new FileStream(zipPath, FileMode.CreateNew)) 
{ 
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create)) 
    { 
     using (SqlConnection con = new SqlConnection(Data.Properties.Settings.Default.SelectionTMPDatabase)) 
     { 
      con.Open(); 

      using (SqlCommand cmd = new SqlCommand(String.Format("SELECT [FileName], [File] FROM {0} WHERE [DownloadId] = @downloadId", Data.Properties.Settings.Default.SelectionFileDatabaseTable), con)) 
      { 
       cmd.Parameters.AddWithValue("@downloadId", downloadID); 

       using (SqlDataReader dr = cmd.ExecuteReader()) 
       { 
        while (dr.Read()) 
        { 
         if (dr["FileName"] != null && dr["FileName"] != DBNull.Value && fileNames.Contains(dr["FileName"].ToString())) 
         { 
          ZipArchiveEntry entry = archive.CreateEntry(dr["FileName"].ToString()); 

          using (StreamWriter writer = new StreamWriter(entry.Open())) 
          { 
           writer.Write((byte[])dr["File"]); 
          } 

Это та часть, где создан .zip. Я надеюсь, что вы можете помочь мне! Если у вас есть какие-либо вопросы просто спросить!

+1

Я бы первым рефакторинг уменьшить вложенности. Разделите извлечение данных из базы данных и запись в файл –

+0

Вы уверены, что массив байтов в 'dr [" File "]' содержит все байты? –

ответ

0

Вы создаете пустую запись в zip, а затем записываете в нее содержимое столбца «Файл» - это действительно то, что вы намереваетесь делать?

Как насчет получить получить полный путь dr["FileName"], а затем просто сделать

archive.CreateEntryFromFile(dr["fileName"], fullPathToFile); 
+0

Да, это то, что я намереваюсь. Я работал с этим методом несколько месяцев назад, и он создал все правильно. Btw нет метода CreateEntryFromFile. –

+0

https://msdn.microsoft.com/en-us/library/hh485720(v=vs.110).aspx, вам необходимо импортировать 'System.IO.Compression'. Я бы проверял, можно ли создать файл PDF непосредственно из данных файла, тогда, как я полагаю, либо кодировка базы данных, либо DataReader путает некоторые символы. –

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