2016-08-16 116 views
0

我爲供應商創建了一個HTML5在線門戶,他們可以根據需要上傳和下載任意數量的文件。不幸的是我不允許向你展示截圖。但是這裏有問題: 如果有2個或更多文件上傳,那麼程序應該創建一個包含所有PDF的.zip文件。它得到正確創建和文件都在裏面,他們是腐敗的,意味着我無法打開它們。除此之外,他們得到1 KB的文件大小。已下載的.zip中的PDF已損壞

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

是的,這是我的意圖。幾個月前,我使用這種方法,並且正確地創建了一切。順便說一句,沒有'CreateEntryFromFile'方法。 –

+0

https://msdn.microsoft.com/en-us/library/hh485720(v=vs.110).aspx,你需要導入'System.IO.Compression'。我會檢查你是否可以直接從文件數據創建一個PDF文件,然後,因爲我想數據庫或DataReader編碼混淆了一些字符。 –