Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 32015|Antwoord: 3

[HTML/HTML5] Gebruik FileReader.readAsArrayBuffer() om grote bestanden in de browser te verwerken

[Link kopiëren]
Geplaatst op 02-06-2019 20:35:17 | | | |
De FileReader API van HTML5 stelt de clientbrowser in staat om de lokale bestanden van de gebruiker te lezen, zodat het geüploade bestand niet langer door de server wordt gelezen, wat de last voor de server aanzienlijk vermindert en de tijd bespaart die nodig is om het bestand te uploaden. In de praktijk heb ik echter gemerkt dat ik een logbestand van 300k gemakkelijk kan verwerken met FileReader.readAsText(), maar als het logbestand zo groot is als 1G of zelfs 2G, crasht de browser. Dit komt doordat readAsText() het doelbestand in één keer in het geheugen laadt, waardoor het geheugen de limiet overschrijdt. Dus als de webapplicatie vaak grote bestanden moet verwerken, moeten we FileReader.readAsArrayBuffer() gebruiken om de bestanden stukje bij beetje te lezen.

Testscenario

Ons scenario is eenvoudig: JavaScript gebruiken om het tijdbereik van een IIS-log te verkrijgen

Voorbeeld IIS-logboeken:

#Software: Microsoft Internet Information Services 10.0
#Version: 1,0
#Date: 2016-08-18 06:53:55
#Fields: datum tijd s-ip cs-methode cs-uri-stem cs-uri-query s-port cs-gebruikersnaam c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2016-08-18 06:53:55 ::1 GET / - 80 - ::1 Mozilla/5.0+(Windows+NT+10.0; +WOW64; +Trident/7.0; +rv:11.0)+like+Gecko - 200 0 0 476
2016-08-18 06:53:55 ::1 GET /iisstart.png - 80 - ::1 Mozilla/5.0+(Windows+NT+10.0; +WOW64; +Trident/7.0; +rv:11.0)+like+Gecko http://localhost/ 200 0 0 3
2016-08-18 08:45:34 10.172.19.198 GET /test/pac/wpad.dat - 80 - 10.157.21.235 Mozilla/5.0+(Windows+NT+6.1; +Win64; +x64; +Trident/7.0; +rv:11.0)+like+Gecko - 404 3 50 265
2016-08-18 08:46:44 10.172.19.198 GET /test/pac/wpad.dat - 80 - 10.157.21.235 Mozilla/5.0+(Windows+NT+6.1; +Win64; +x64; +Trident/7.0; +rv:11.0)+like+Gecko - 200 0 0 6
Ons doel is om het tijdsbestek van dat logboek te achterhalen:

Starttijd: 18-08-2016 06:53:55
Eindtijd: 2016-08-18 08:46:44

Gebruik readAsText()-implementatie

Het gebruik van readAsText() is relatief eenvoudig: nadat je de string van het hele bestand hebt gehaald, haal je de eerste 19 tekens van elke regel vanaf het begin, bepaal of het datumformaat wordt gehaald, als het wordt voldaan, dan zijn deze 19 tekens de starttijd, en hetzelfde gaat door elke regel vanaf de staart om de eindtijd te krijgen, de code is als volgt:


De lopende resultaten van het steekproef IIS-logboek (grootte: 1k) zijn zoals we verwachtten.



Maar zodra we kiezenEen groter IIS-log (grootte: 2G) en de browser crasht。 De reden is dat readAsText() het hele bestand eerst in het geheugen laadt, dus als het bestand te groot is, is er niet genoeg geheugen en crasht het browserproces.


Gebruik readAsArrayBuffer()-implementatie

Omdat het File-object in JavaScript van Blob erft, kunnen we de Blob.slice()-methode gebruiken om het bestand in kleine stukjes te knippen; het algemene idee is:

Neem eerst de eerste 10.000 inhoud van het bestand en zet deze om naar tekst
Neem de eerste 19 tekens van elke regel vanaf het begin om te bepalen of het datumformaat wordt gehaald, en zo ja, dan zijn deze 19 tekens de starttijd
Neem dan de 10.000 inhoud aan het einde van het bestand en zet die om in tekst
Op dezelfde manier doorkruis je elke lijn vanuit de staartinhoud om de eindtijd te krijgen

De code is als volgt:


Met readAsArrayBuffer() konden we in zeer korte tijd de gewenste resultaten krijgen, zelfs met meer dan 2G IIS-logs.






Vorig:php roept de SMS-verificatiecode-interface aan
Volgend:export, naamloze export en standaardexport
 Huisbaas| Geplaatst op 02-06-2019 20:39:24 |
Geplaatst op 17-09-2021 09:11:00 |
Prompt:Auteurs worden verbannen of verwijderde inhoud wordt automatisch geblokkeerd
Geplaatst op 21-12-2021 18:26:43 |
Leer en leer van de methoden van de verhuurder
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com