Próbuję napisać skrypt do pobierania obrazów za pomocą node.js. Oto, co mam do tej pory:
var maxLength = 10 // 10mb
var download = function(uri, callback) {
http.request(uri)
.on('response', function(res) {
if (res.headers['content-length'] > maxLength*1024*1024) {
callback(new Error('Image too large.'))
} else if (!~[200, 304].indexOf(res.statusCode)) {
callback(new Error('Received an invalid status code.'))
} else if (!res.headers['content-type'].match(/image/)) {
callback(new Error('Not an image.'))
} else {
var body = ''
res.setEncoding('binary')
res
.on('error', function(err) {
callback(err)
})
.on('data', function(chunk) {
body += chunk
})
.on('end', function() {
// What about Windows?!
var path = '/tmp/' + Math.random().toString().split('.').pop()
fs.writeFile(path, body, 'binary', function(err) {
callback(err, path)
})
})
}
})
.on('error', function(err) {
callback(err)
})
.end();
}
Chcę jednak uczynić to solidniejszym:
- Czy są biblioteki, które robią to i robią to lepiej?
- Czy jest szansa, że nagłówki odpowiedzi kłamią (o długości, o typie treści)?
- Czy są jakieś inne kody statusu, które powinny mnie zainteresować? Czy powinienem zawracać sobie głowę przekierowaniami?
- Myślę, że gdzieś przeczytałem, że
binary
kodowanie zostanie wycofane. Co mam wtedy zrobić? - Jak mogę to uruchomić w systemie Windows?
- Czy są jakieś inne sposoby na ulepszenie tego skryptu?
Dlaczego: w przypadku funkcji podobnej do imgur, w której użytkownicy mogą podać mi adres URL, pobieram ten obraz i ponownie hostuję obraz w wielu rozmiarach.
image
node.js
image-processing
download
Jonathan Ong
źródło
źródło
Napotkałem ten problem kilka dni temu, aby uzyskać czystą odpowiedź NodeJS, sugerowałbym użycie Stream do scalenia fragmentów razem.
Najnowsze wersje Node nie będą dobrze współpracować z ciągami binarnymi, więc łączenie fragmentów z ciągami nie jest dobrym pomysłem podczas pracy z danymi binarnymi.
* Po prostu bądź ostrożny używając 'data.read ()', spowoduje to opróżnienie strumienia dla następnej operacji 'read ()'. Jeśli chcesz go użyć więcej niż raz, przechowuj go gdzieś.
źródło
Możesz użyć Axios ( klienta HTTP opartego na obietnicy dla Node.js) do pobierania obrazów w wybranej kolejności w środowisku asynchronicznym :
Następnie możesz skorzystać z następującego podstawowego przykładu, aby rozpocząć pobieranie obrazów:
źródło
download_image
aby przechwytywać zdarzenie „zakończenie” i „błąd” dla zwróconej obietnicyjeśli chcesz postęp pobierania, spróbuj tego:
jak używać:
uwaga: należy zainstalować oba moduły request i request-progress przy użyciu:
źródło
statusCode
czeku. Na przykład kod statusu 500 nie trafi do'on("error", e)
. Dodanieon('response', (response) => console.error(response.statusCode))
Opierając się na powyższym, jeśli ktoś potrzebuje obsługi błędów w strumieniach zapisu / odczytu, użyłem tej wersji. Zwróć uwagę, że
stream.read()
w przypadku błędu zapisu jest to wymagane, abyśmy mogli zakończyć odczyt i wyzwolićclose
strumień odczytu.źródło
stream.read()
wydaje się być nieaktualny, wyrzuca błądnot a function
źródło
To jest rozszerzenie odpowiedzi Cezarego. Jeśli chcesz pobrać go do określonego katalogu, użyj tego. Użyj również const zamiast var. W ten sposób jest bezpieczny.
źródło