Pracuję z niestandardowym interfejsem API, aby umożliwić użytkownikowi przesłanie pliku (o, miejmy nadzieję, o dowolnym rozmiarze). Jeśli plik jest zbyt duży, będzie on dzielony na kawałki i obsługiwany na wiele żądań do serwera.Co właściwie robi metoda HTML5 File.slice?
Piszę kod, który używa File
i FileReader
(HTML5), jak w wielu przykładach z Internetu. W ogóle (z tego co czytałem online) dla chunkfied transferu plików, ludzie najpierw uzyskać blob danych z ich obiektu pliku
var file = $('input[type=file]')[0].files[0];
var blob = file.slice(start,end)
Następnie użyj FileReader
przeczytać blob readAsArrayBuffer(blob)
lub readAsBinaryString(blob)
I wreszcie w metodzie FileReader.onload(e)
, wyślij dane do serwera. Powtórz ten proces dla wszystkich porcji w pliku.
Moje pytania są
Dlaczego muszę używać FileReader
? Jeśli go nie używam i po prostu wysyłam obiekty BLOB z numerem File.slice
, istnieje gwarancja, że operacja krojenia zostanie wykonana przed próbą wysłania danych w każdym żądaniu. Czy obiekt File
wczytuje cały plik po jego utworzeniu (na pewno nie?). Czy File.slice
szuka pozycji określonej przez parametry, a następnie odczytuje informacje? Dokumentacja nie daje mi wskazówek, jak to jest zaimplementowane.
Dziękuję, że definiując plik dla mnie, ma to więcej sensu. Jeśli jednak nadal używam File.Slice (który zwraca blob), a następnie próbuję wysłać ten blob do serwera przy użyciu XMLHttpRequest.send (myBlob), jak/kiedy są dane pobierane z pliku i przekazywane do serwera . Czy może to po prostu zawieść/nie wysłać żadnych danych? - – Ponml
Zaktualizowałem swoją odpowiedź, aby podać trochę więcej szczegółów. Wciągnąłem się w to bardzo głęboko, kiedy pisałem narzędzie javascript rsync: https://github.com/claytongulick/bit-sync –