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

Verwendung von Kubernetes YAML-Dateien

Inhaltsverzeichnis 01 Einführung in YAML-Dateien ...

Analyse des Ereignisschleifenmechanismus von JavaScript

Inhaltsverzeichnis Vorwort: 1. Gründe für die Ere...

Definieren Sie Ihre eigene Ajax-Funktion mit JavaScript

Da die von nativen JS initiierten Netzwerkanforde...

Die Prinzipien und Mängel der MySQL-Volltextindizierung

Der MySQL-Volltextindex ist ein spezieller Index,...

So führen Sie MySQL mit Docker-Compose aus

Verzeichnisstruktur . │ .env │ docker-compose.yml...

Der Kernprozess der NodeJS-Verarbeitung einer TCP-Verbindung

Vor ein paar Tagen habe ich mit einem Freund etwa...

JS implementiert WeChats "Shit Bombing"-Funktion

Hallo zusammen, ich bin Qiufeng. Vor Kurzem hat W...

Warum MySQL das Löschen von Daten nicht empfiehlt

Inhaltsverzeichnis Vorwort InnoDB-Speicherarchite...

Detaillierte Erklärung der MySQL 8.0.18-Befehle

Öffnen Sie den gerade entpackten Ordner C:\web\my...

So löschen Sie die Hintergrundfarbe des A-Tags, wenn in H5 darauf geklickt wird

1. Die blaue Farbe des Tags wird aufgehoben, wenn...

DNS-Konfigurationsmethode für den Linux Domain Name Service

Was ist DNS Der vollständige Name von DNS lautet ...

Objektorientierte JavaScript-Implementierung eines Lupengehäuses

In diesem Artikel wird der spezifische Code der o...