Le téléchargement de blobs en plusieurs parties provoque net:: fichier ERR ne se trouve pas sur Chrome après 500mb

j'ai un problème vraiment bizarre seulement sur Google Chrome et Chrome.

L'arrière-plan est le suivant:

je télécharge des fichiers vers mon serveur en utilisant la méthode de téléchargement multi-parties, ce qui signifie que je casse les fichiers en morceaux de 10 Mo et envoie chaque morceau au serveur. Cela fonctionne parfaitement dans tous les navigateurs avec des fichiers de n'importe quelle taille, le problème a commencé quand j'ai eu besoin de crypter chaque morceau.

pour le cryptage j'utilise des CryptoJS et, avant de télécharger le morceau, je le crypte et récupérer la Blob pour télécharger, cela fonctionne très bien sur Chrome quand je dois télécharger moins de 50 morceaux (50 blobs, environ 500 Mo au total), après cela je reçois un POST http://(...) net::ERR_FILE_NOT_FOUND.

bizarrement, cela fonctionne sur tous les autres navigateurs, y compris Opera qui est essentiellement Chrome de nos jours, sauf Chrome et Chrome. Je l'ai testé sur IE, Firefox, Edge, Safari, Opera, Chrome et Chrome.

ci-dessous vous pouvez voir comment mon code fonctionne pour que vous puissiez avoir une idée, ce n'est pas le code réel que j'utilise dans l'application mais, plutôt, c'est un code de test que j'ai écrit qui donne le même résultat.

au Lieu d'obtenir une tranche (File.slice) du fichier je vais télécharger comme un morceau et le Chiffrer pour obtenir le blob, je vais générer un faux blob avec la taille de mon morceau. J'ai mis le setTimeout pour simuler le temps qu'il faut pour chiffrer un blob. Comme je l'ai dit avant, j'obtiens le même résultat que mon vrai code en faisant ceci:

function uploadNext(prevResponse) {  
    if (currentPart == totalPartsFile)
        return;

    //var chunk = getNextChunk();
    var totalSize = file.size;

    setTimeout(function() {
        var blob = new Blob([new ArrayBuffer(constants.chunkSize)], {
            type: 'application/octet-string',
            name: file.name
        });

        console.log(blob);

        blob.encrypted = true;
        blob.key = encryptionKey;
        blob.mimeType = file.mimeType;
        blob.name = file.name;
        blob.originalFileSize = originalFileSize || file.size;

        uploadFile(objectId, currentPart, blob, totalSize, prevResponse, function(resp) {
            uploadNext(resp);
        });
    }, 1000);
}

ainsi, le code ci-dessus est où mon blob est généré, vous trouverez ci-dessous le téléchargement de la partie:

function uploadFile (objectId, index, blob, totalSize, prevResponse, callback) {

    var format = "encrypted";
    var params = "?format=" + format + (format === "encrypted" ? "&encoding=base64" : "");
    var endPoint = constants.contentServiceUrl + resourceService.availableResources.addContents.link.split(':objectId').join(objectId) + params;

    var formData = new FormData();

    formData.append("totalFileSizeBytes", totalSize);
    formData.append("partIndex", index);
    formData.append("partByteOffset", previousOffset);
    formData.append("chunkSize", blob.size);
    formData.append("totalParts", totalPartsFile);
    formData.append("filename", blob.name);

    if (currentPart != 0) {
        formData.append("uploadId", prevResponse.uploadId);
        formData.append("bucket", prevResponse.bucket);
    }

    if (finalChunk) {
        for (var key in etags1) {
            formData.append("etags[" + key + "]", etags1[key]);
        }
    }

    formData.append("data", blob);

    previousOffset += blob.size;

    var request = {
        method: 'POST',
        url: endPoint,
        data: formData,
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    }

    $http(request)
        .success(function(d) {
            _.extend(etags1, d.etags);
            console.log(d);
            callback(d);
        })
        .error(function(d) {
        console.log(d);
    });                                                
}

bien sûr, il y a d'autres variables et codes que je n'ai pas mis ici, mais c'est suffisant pour donner une idée de ce à quoi nous avons affaire.

dans cet exemple J'utilise AngularJS' $http module, mais j'ai essayé avec de la pure XMLHttpRequest et j'ai eu le même résultat.

comme je l'ai dit, Je n'obtiens que le POST http://(...) net::ERR_FILE_NOT_FOUND avec des fichiers de plus de 499mo (50+ morceaux) et seulement en Chrome.

je poste ceci ici car j'ai cherché une solution mais je n'ai rien trouvé en rapport avec ce problème, la chose la plus proche que j'ai trouvé sur internet était cette question dans le Forum du projet Chromium:

https://code.google.com/p/chromium/issues/detail?id=375297

À ce stade, je ne sais vraiment plus quoi faire, alors je voudrais savoir si quelqu'un a eu un problème similaire dans le passé et pourrait résoudre d'une certaine manière.

Merci pour les réponses à l'avance.

16
demandé sur Eric.M 2016-01-14 05:56:39

3 réponses

Le chrome peut allouer seulement 500mb pour n'importe quel blob, donc si vous essayez d'allouer 500mb + 1 byte, il ignorera clairement ce byte, pour résoudre ceci vous devrez lire le dossier dans les morceaux de 499mb et alors vous devrez fusionner le dossier au serveur.

ou vous pouvez essayer quelque chose comme ZipJS et ensuite télécharger le zip, il a fonctionné pour moi.

    var zip = new JSZip();
    zip.file("file1", "content1");
    zip.file("file2", "content2");
1
répondu MehulJoshi 2017-05-05 06:57:35

enfin des fichiers sources de chrome, j'avais trouvé des limites de blob.

  1. ChromeOS:

    • Ram-20%
    • disque - 50% Note: Le disque est la partition de l'utilisateur, donc le système d'exploitation peut encore fonctionner si elle est pleine.
  2. Android:

    • RAM-1%
    • disque-6%
  3. ordinateur de Bureau:
    • Ram - 20%, ou 2 Go si x64.
    • Disque - 10%

chrome repo lien: https://cs.chromium.org/chromium/src/storage/browser/blob/blob_memory_controller.cc?l=63

1
répondu Alex Nikulin 2018-01-09 05:40:03

Semble, c'est Firebug plugin en question. Essayez de le désactiver. Il fonctionne pour moi.

navigateur Firefox. J'ai eu un problème quand j'ai chargé le fichier en morceaux. J'ai désactivé les plugins et la fuite de mémoire n'apparaît pas. Peut-être que ça vous aidera

pour Chrome tout fonctionne bien.

-1
répondu Dmitry M 2016-06-01 10:36:35