C# / PHP- Download / Vérification


Le téléchargement est souvent une contrainte pour un développeur. Il faut effectuer de nombreuses actions pour que tout soit conforme.

Pour se faire je vais vous présenter une méthode utilisant les fonctions de hashage (.Net pour le client et en PHP pour le serveur). Voilà l'ordonnancement des tâches à effectuer pour un téléchargement optimal :
- Vérifier la présence du fichier en local, s'il est présent en faire un hashage que je nomme "HL1"

- Demander le hashage du fichier distant via le script PHP afin d'obtenir "HD1".

 - Comparer "HL1" et "HD1" afin de voir s'ils sont identique ou pas.
- S'ils sont identique ne rien faire == FIN

- Dans le cas contraire, télécharger le fichier distant.
- Générer la clé de hashage du fichier téléchargé "HT1".
- Vérifier que la clé de hashage du téléchargement soit identique à la clé de hashage du ficher distant "HT1" = "HD1
- Si les clés sont identique, remplacer le fichier local par le fichier télécharger == FIN
- Sinon refaire le téléchargement.

1/ Script PHP de génération de la clé de hashage d'un fichier

<?PHP
 $path = $_POST["path"];
 if(empty($path))
  $path = $_GET["path"];

 if(!empty($path)) {
  $filePath = $ARBORESCENCE_PATH.urldecode($path);
  if(file_exists($filePath)) {
   echo sha1_file($filePath);
  } else {
   echo -1;
  }
 } else {
  echo -1;
 }
?>

 

2/ Méthode permettant de récupérer la clé de hashage en .Net/C# via le script PHP

String urlToCheck = "http://" + this.CHECK_DOMAINE + "/act_check.php?path=" + System.Web.HttpUtility.UrlEncode(remoteFilePath) + "&" + System.Web.HttpUtility.UrlEncode(DateTime.Now.ToString());
 using (System.Net.WebClient _getFileVersion = new System.Net.WebClient())
 {
         byte[] responseArray = _getFileVersion.DownloadData(urlToCheck);
         String remoteCheckSum = System.Text.Encoding.ASCII.GetString(responseArray).ToUpper();
 }


2/ Méthode .Net/C# permettant de comparer les clés de hashage

private bool checkSameFileReleased(String filePath, String remoteHashKey)
        {
            String localCheckSum = String.Empty;
            using (System.IO.FileStream fs = System.IO.File.OpenRead(filePath))
            {
                System.Security.Cryptography.SHA1Managed _sha1 = new System.Security.Cryptography.SHA1Managed();
                byte[] checksum = _sha1.ComputeHash(fs);
                localCheckSum = BitConverter.ToString(checksum).Replace("-", String.Empty).ToUpper();
            }
            if (localCheckSum.ToLower().CompareTo(remoteHashKey.ToLower()) == 0)
                return true;
            else
                return false;
        }

 

Mise à jour le Mercredi, 28 Octobre 2009 11:20