2017-10-04 22 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パスワードは英数字ですが、現用パスの1つ: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 2人のユーザーが同時にZipファイルを要求している場合は、問題が発生した場合に試してみることができます。 – Smartis

+0

あなたの変更により、4つの異なるパスワードが生成され、それらのうちのどれもがファイルを解凍するのに適切ではありません。私のログ: '10/4/2017 11:22:55 AM => FilePasswordメソッドからのパスワード:iowSYgGB4Nbi 10/4/2017 11:22:55 AM => FilePasswordメソッドからのパスワード:mmnZeM1sz3ln 2011/10/4 11 :22:55 AM =>圧縮ファイルからのパスワード:mmnZeM1sz3ln 10/4/2017 11:22:57 AM => FilePasswordメソッドからのパスワード:3xUeKXkWveIv 10/4/2017 11:22:58 AM => FilePasswordからのパスワードメソッド:nKNZW67O6yi1'ジッパーファイルのパスワードに気づいていますが、これも機能していません。 – Mony

関連する問題