Eine Falle und Lösung bei der Verwendung von fileReader

Eine Falle und Lösung bei der Verwendung von fileReader

Eine Falle bei fileReader

Wenn Sie fileReader zum Durchsuchen von Bildern verwenden,

Verwenden des Base64-Formats

var Datei = this.$refs.resource.files[0]
var reader = neuer FileReader();
// Lesen Sie die Datei als DataURL:
reader.readAsDataURL(Datei);
//Der Rückruf-JS nach dem Lesen ist ein Multithread-Reader.onloadend=(e)=>{
}

Javascript selbst ist Single-Threaded und hat keine asynchronen Funktionen. Da in Browsern JavaScript verwendet wird und der Browser selbst ein typischer GUI-Arbeitsthread ist, werden GUI-Arbeitsthreads in den meisten Systemen als Ereignisverarbeitung implementiert, um blockierende Interaktionen zu vermeiden, wodurch das asynchrone Gen von JavaScript entsteht. Alles, was danach geschah, hatte hier seinen Ursprung.

Das stimmt: Netzwerk, Dateien. . . . Alle sind auf Basis von Browser-Schnittstellen implementiert

Wenn dieselbe Datei zweimal gelesen wird, wird das Ereignis zum Abschluss des Ladevorgangs nicht ausgeführt.

Fallstricke von FileReader unter iOS (Image zu Base64)

Ich arbeite gerade an einem Projekt. Das Hochladen von Bildern ist eine sehr alte Funktion. Dann möchte ich das Bild komprimieren und direkt auf base64 hochladen... Der Code, den ich am Anfang verwendet habe

var Dateiupload = Funktion (Objekt, Rückruf) {
            //Überprüfen Sie, ob der Browser das FileReader-Objekt unterstützt if (typeof FileReader == "undefined") {
                alert("Ihr Browser unterstützt das FileReader-Objekt nicht!");
            }
            var Datei = Obj;
            //Beurteilen, ob der Typ ein Bild ist, wenn (!/image\/\w+/.test(file.type)){
                alert("Bitte stellen Sie sicher, dass es sich bei der Datei um einen Bildtyp handelt");
                gibt false zurück;
            }
            var reader = neuer FileReader();
            reader.onload = Funktion (e) {
                var img = neues Bild,
                    width = 95, //Bildgrößenänderungsbreite quality = 0.2, //Bildqualität canvas = document.createElement('canvas'),
                    Schublade = Leinwand.getContext("2d");
                img.src = dieses.Ergebnis;
                var scale = parseInt(Bildhöhe / Bildbreite);
                img.width=Breite;
                img.height = Breite * Maßstab;
                Leinwand.Breite = Bild.Breite;
                Leinwandhöhe = Bildhöhe;
                Schublade.drawImage(testimgId, 0, 0, Leinwandbreite, Leinwandhöhe);
                var base64 = canvas.toDataURL('image/jpeg', 0.2);
                konsole.log(base64);
                var image_base64 = img.src.replace("data:image/png;base64,","");
                image_base64=URI-Komponente kodieren(image_base64);
                Alarm("19")
                //Rückruf aufrufen callback&&callback(img.src);
            }
            reader.readAsDataURL(Datei);
        }

Der obige Code funktioniert auf PC und Android einwandfrei, gibt unter iOS jedoch eine feste Zeichenfolge mit Base64-Kodierung zurück, unabhängig davon, welches Bild Sie hochladen.

Dann ändern...

Nochmal ändern.....

Verschiedene Dokumente anzeigen..

Weiter ändern...

So wurde es schließlich gelöst

Funktion getBase64(Dateiobjekt){
            var Datei = Dateiobjekt,
                cvs = document.getElementById("Leinwand"),
                ctx = cvs.getContext("2d");
            if(Datei){
                var url = window.URL.createObjectURL(file); //PS: Nicht kompatibel mit IE
                var img = neues Bild();
                img.src = URL;
                img.onload = Funktion(){
                    ctx.clearRect(0,0,cvs.Breite,cvs.Höhe);
                    cvs.width = Bildbreite;
                    cvs.height = img.height;
                    ctx.drawImage(Bild,0,0,Bildbreite,Bildhöhe);
                    var base64 = cvs.toDataURL("bild/png");
                    Rückruf (Base64);
                    Alarm("20")
                }
            }
        }

Das ist der Sinn des Teilens ...

Der Grund ist, dass FileReader-Objekte unter iOS nicht unterstützt werden!

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • Beispielanalyse für Datei-, FileReader- und Ajax-Dateiupload (php)
  • js verwendet FileReader zum Lesen lokaler Dateien oder Blobs
  • Verwenden Sie JS, um Dateien zu bearbeiten (FileReader liest --node's fs)
  • So erhalten Sie den Inhalt einer TXT-Datei über FileReader in JS

<<:  translate(-50%,-50%) in CSS erzielt horizontalen und vertikalen Zentrierungseffekt

>>:  Eine kurze Diskussion über den Entwurf und die Optimierung von MySQL-Baumstrukturtabellen

Artikel empfehlen

Lösung für das Problem des verstümmelten Codes in MySQL 5.x

MySQL ist eine häufig verwendete Open-Source-Date...

Mybatis implementiert Details zum Abfangen und Ändern von SQL-Abfragen

Vorwort Eine der Funktionen eines Interceptors be...

Angular Dependency Injection erklärt

Inhaltsverzeichnis Überblick 1. Abhängigkeitsinje...

So legen Sie eine statische IP für den Ubuntu 18.04-Server fest

1. Hintergrund Netplan ist ein neues Befehlszeile...

Konfigurationsprozess für die MySQL-Master-Slave-Replikation

Konfiguration der Hauptbibliothek 1. Konfiguriere...

MySQL 8.0.12 Installationskonfigurationsmethode und Kennwortänderung

In diesem Artikel werden die Installations- und K...

Erstellen Sie ein Docker-Image mit Dockerfile

Inhaltsverzeichnis Erstellen Sie ein Docker-Image...

Natives JavaScript zur Implementierung einer zufälligen Namensaufruftabelle

In diesem Artikelbeispiel wird der spezifische Co...

Javascript-Countdown-Eingabeaufforderungsfeld

In diesem Artikelbeispiel wird der spezifische Ja...

Detaillierte Erklärung der Set-Datenstruktur von JavaScript

Inhaltsverzeichnis 1. Was ist Set 2. Konstruktor ...