Pb téléchargement JPG

Le piège du type Blob en JavaScript (Ligne critique 111)

Dans ton code, après avoir récupéré le fichier, tu tentes de reconstruire un fichier binaire avec cette ligne :

JavaScript

const blob = new Blob([this.response], { type: 'application/octet-stream' });

Puisqu’il s’agit d’une image JPG, forcer un type application/octet-stream directement dans la création du Blob JavaScript peut pousser le navigateur (ou les sécurités du serveur mutualisé lors de l’échange) à rejeter le traitement du flux.

Comment corriger ton code JavaScript ?

Il est préférable de laisser le Blob utiliser le type MIME natif renvoyé par le serveur. Remplace ton bloc xhr.onload (à partir de la ligne 110) par cette version nettoyée :

JavaScript

xhr.onload = async function() {
    if (this.status === 200) {
        // Correction ici : On prend directement la réponse sans forcer le type binaire
        const blob = this.response; 
        const url = window.URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(url);
        document.body.removeChild(a);

        // Calculer le hash SHA-256 du fichier téléchargé
        const fileHash = await calculateBlobHash(blob);
        statusElement.textContent = `Téléchargement terminé! Hash: ${fileHash}`;

        // Comparer les hashs
        if (fileHash === expectedHash) {
            statusElement.textContent += " - Vérification réussie: Les hashs correspondent.";
            logDownload(filename, 'success');
        } else {
            statusElement.textContent += " - Erreur: Les hashs ne correspondent pas!";
            logDownload(filename, 'hash_mismatch');
        }
    } else {
        statusElement.textContent = 'Erreur lors du téléchargement (Code ' + this.status + ') !';
        logDownload(filename, 'failed');
    }
    // Masquer l'icône de chargement et le bouton Stop
    progressContainer.style.display = 'none';
    spinner.style.display = 'none';
    stopBtn.style.display = 'none';
};