Saya mencoba menulis skrip untuk mengunduh gambar menggunakan node.js. Inilah yang saya miliki sejauh ini:
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();
}
Namun, saya ingin membuatnya lebih kuat:
- Apakah ada perpustakaan yang melakukan ini dan melakukan ini dengan lebih baik?
- Apakah ada kemungkinan tajuk respons berbohong (tentang panjang, tentang jenis konten)?
- Apakah ada kode status lain yang harus saya pedulikan? Haruskah saya repot dengan pengalihan?
- Saya pikir saya membaca suatu tempat bahwa
binary
pengkodean akan ditinggalkan. Apa yang harus saya lakukan? - Bagaimana saya bisa membuatnya bekerja di windows?
- Adakah cara lain untuk membuat skrip ini lebih baik?
Mengapa: untuk fitur yang mirip dengan imgur di mana pengguna dapat memberi saya URL, saya mengunduh gambar itu, dan memasang ulang gambar dalam berbagai ukuran.
image
node.js
image-processing
download
Jonathan Ong
sumber
sumber
Saya mengalami masalah ini beberapa hari yang lalu, untuk jawaban murni NodeJS saya sarankan menggunakan Stream untuk menggabungkan potongan-potongan bersama.
Versi Node terbaru tidak akan bekerja dengan baik dengan string biner, jadi menggabungkan potongan dengan string bukanlah ide yang baik ketika bekerja dengan data biner.
* Berhati-hatilah saat menggunakan 'data.read ()', itu akan mengosongkan aliran untuk operasi 'baca ()' berikutnya. Jika Anda ingin menggunakannya lebih dari sekali, simpan di suatu tempat.
sumber
Anda dapat menggunakan Axios ( klien HTTP berbasis janji untuk Node.js) untuk mengunduh gambar sesuai urutan pilihan Anda di lingkungan asinkron :
Kemudian, Anda dapat menggunakan contoh dasar berikut untuk mulai mengunduh gambar:
sumber
download_image
untuk menangkap acara 'selesai' dan 'kesalahan' untuk janji yang dikembalikanjika Anda ingin kemajuan unduh coba ini:
Cara Penggunaan:
Catatan: Anda harus menginstal modul permintaan & permintaan-kemajuan menggunakan:
sumber
statusCode
cek. StatusCode 500 misalnya, tidak akan menekan'on("error", e)
. Dengan menambahkanon('response', (response) => console.error(response.statusCode))
itu sangat memudahkan debugging,Membangun di atas, jika ada yang perlu menangani kesalahan dalam menulis / membaca aliran, saya menggunakan versi ini. Catat
stream.read()
jika terjadi kesalahan tulis, itu diperlukan agar kami dapat selesai membaca dan memicuclose
pada aliran baca.sumber
stream.read()
tampaknya sudah ketinggalan zaman, melempar kesalahannot a function
sumber
Ini adalah perpanjangan dari jawaban Cezary. Jika Anda ingin mengunduhnya ke direktori tertentu, gunakan ini. Juga, gunakan const bukan var. Aman seperti ini.
sumber