2017-10-04 112 views
0

場景:上傳文件比嘗試壓縮它使用DotNetZip密碼保護,密碼生成與Membership.GeneratePassword()方法。一切工作正常,除非有時用戶不能使用生成的密碼解壓縮文件。有線的事情是,這種情況只發生,有時讓我們說15次中的1次。 生成密碼:DotNetZip解壓縮時密碼錯誤

public static String FilePassword() 
{ 
    while (_filePassword.Length < 12) 
    { 
     _filePassword += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit)); 
    } 

    return _filePassword; 
} 

保存文件:

if (FileUploadControl.HasFile) 
{ 

    fileName = Path.GetFileName(FileUploadControl.FileName); 
    FileUploadControl.SaveAs(FileSavePath + fileName); 

     // Archive uploaded file to zip. 
     using (ZipFile zip = new ZipFile()) 
     { 
      // File to be archived. 
      var file = FileUploadControl.PostedFile; 

      // Enable encryption of file 
      zip.Encryption = EncryptionAlgorithm.PkzipWeak; 

      // Set password. 
      zip.Password = Settings.FilePassword(); 

      // Set temporary folder path for archive process. 
      zip.TempFileFolder = tempPath; 

      // Add file to archive with its path. 
      zip.AddFile(FileSavePath + file.FileName, ""); 

      File objFile = new File(file.FileName, FileSavePath); 

      // Save zip file with the name as file ID. 
      zip.Save(FileSavePath + file.FileName); 
     } 
} 

我登錄密碼,而創造的方法,也同時保護zip文件與密碼,他們總是匹配,我看不出有什麼不對,爲什麼有時解壓縮文件時會顯示錯誤的密碼。

+0

,你能否告訴我們,沒有工作,沒有工作的密碼的一些例子嗎? – mjwills

+0

您是否檢查過密碼的字符編碼? – Baccata

+0

@mjwills密碼是字母數字,其中一個工作通行證:vKkowRZBtIxo,不工作一個:QjCFFaM9LumZ – Mony

回答

1

爲什麼使用FilePassword()中的靜態全局變量_filePassword而不是範圍之一?

這種方式可以從外部修改,或者甚至可能仍包含上次使用的值。另外它不是線程安全的,沒有lock

解決與本地變量,它應該沒問題。

public static String FilePassword() 
{ 
    string retString = string.Empty; 
    while (retString.Length < 12) 
    { 
     retString += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit)); 
    }  
    return retString; 
} 

您也可以記錄返回值。


樣的理解

if (FileUploadControl.HasFile) 
{ 

    fileName = Path.GetFileName(FileUploadControl.FileName); 
    FileUploadControl.SaveAs(FileSavePath + fileName); 
    string filePassword = Settings.FilePassword(); // Contains the Password 

    using (ZipFile zip = new ZipFile()) 
    { 
     var file = FileUploadControl.PostedFile; 
     zip.Encryption = EncryptionAlgorithm.PkzipWeak;    
     zip.Password = filePassword; // <-- Set password for ZIP 
     zip.TempFileFolder = tempPath; 
     zip.AddFile(FileSavePath + file.FileName, ""); 
     File objFile = new File(file.FileName, FileSavePath); 
     zip.Save(FileSavePath + file.FileName); 
    } 

    // Log this value! 
    Log(filePassword); 
} 
+0

好點。它是從以前的代碼中直接用'GeneratePassword'方法生成密碼的,因此它也有特殊字符。會給你的建議嘗試看看是否有幫助。 – Mony

+0

@Mony如果你的問題發生,如果兩個用戶同時請求一個Zip文件,你可以嘗試。 – Smartis

+0

您的更改會生成4個不同的密碼,而其中的非密碼對於解壓縮文件是正確的。我的日誌:'10/4/2017 11:22:55 AM => FilePassword方法的密碼:iowSYgGB4Nbi 10/4/2017 11:22:55 AM => FilePassword方法的密碼:mmnZeM1sz3ln 10/4/2017 11 :22:55 AM =>密碼從壓縮文件:mmnZeM1sz3ln 10/4/2017 11:22:57 AM =>密碼從FilePassword方法:3xUeKXkWveIv 10/4/2017 11:22:58 AM =>密碼從FilePassword方法:nKNZW67O6yi1'注意壓縮時使用的壓縮文件密碼,即使這個壓縮文件不工作 – Mony