Saya menemukan persyaratan seperti itu dalam pekerjaan saya, dan saya perlu menggunakan nodeJs untuk mengunggah file. Saya dulu hanya tahu cara mengunggah file melalui browser. Jika saya menggunakan nodeJs, itu setara dengan mensimulasikan perilaku browser. Setelah Google, saya menyadari bahwa browser hanya menggunakan protokol HTTP untuk mengirimkan data ke server. Protokol spesifiknya adalah "RFC 1867 - Unggah file berbasis formulir di HTML". Mengunggah file melalui formulir formulir di browser adalah melalui protokol ini. Pertama -tama kita dapat melihat data apa yang dikirim browser ke server, dan kemudian kita dapat mengimplementasikan fungsi unggahan sesuai dengan salinannya. Ketika datang untuk mengunggah file pada formulir formulir, semua orang harus terbiasa dengan:
<Form Action = "http://www.qq.com/" Method = "Post"> <input type = "text" name = "text1" /> <br /> <input type = "text" name = "text2" /> <br /> <input type = "kirim" /> < /form.
Saat mengirimkan, Anda dapat melihat bahwa data berikut dikirim ke server dengan menggunakan Fiddler untuk menangkap paket:
Posting http://www.qq.com/ http/1.1
Host: www.qq.com
Panjang konten: 23
Tipe konten: Aplikasi/X-WWW-Form-Urlencoded; Charset = UTF-8
text1 = hello & text2 = world
Perlu dicatat bahwa default tipe konten untuk aplikasi/X-WWW-Form-Burlencoded, sehingga pesan akan dikodekan URL. Misalnya, "Halo" akan dikodekan sebagai%E4%BD%A0%E5%A5%BD.
Selanjutnya, mari kita lihat bagaimana formulir diunggah. Setiap orang harus terbiasa dengan:
<Form Action = "http://www.qq.com" Method = "POST" ENCTYPE = "Multipart/Form-Data"> <input type = "file" name = "myfile"/> <input type = "kirim" value = "kirim"/> </bentuk>
Kemudian buat file teks unggahan.txt baru dengan hanya kata hello world dan unggah. Kami menggunakan Fiddler untuk mengambil paket. Kita dapat menemukan bahwa mengirim data masa lalu sedikit lebih rumit (banyak jalur permintaan lain yang tidak terkait telah dihapus, seperti kontrol cache dan cookie):
Posting http://www.qq.com/ http/1.1
Host: www.qq.com
Panjang konten: 199
Tipe konten: multipart/form-data; Boundary = --- WebKitFormBoundaryWr3x7sxbyqq4zf5g
----- webkitformboundarywr3x7sxbyqq4zf5g
Disposisi konten: Data formulir; name = "myfile"; FileName = "unggah.txt"
Jenis konten: Teks/polos
halo dunia
----- webkitformboundarywr3x7sxbyqq4zf5g--
Menurut definisi RFC 1867, kita perlu menghasilkan sepotong data batas. Data ini tidak dapat muncul di tempat lain dalam konten. Ini dapat didefinisikan sendiri. Algoritma generasi dari masing -masing browser mungkin berbeda. Batas di atas adalah untuk memisahkan data. Setelah menghasilkan data yang terpisah, data yang dipisahkan dapat ditempatkan dalam tipe konten di kepala dan dikirim ke server, yaitu, tipe konten di atas: multipart/form-data; Boundary = --- WebKitFormBoundaryWr3x7sxbyqq4zf5g, Selain itu, konten yang diunggah perlu dipisahkan menjadi beberapa segmen dengan data terpisah, dan setiap segmen data memiliki nama file, dan nama saat mengunggah. Server menggunakan nama ini untuk menerima file, dan tipe jenis konten jenis file. Dalam contoh ini, teks/polos. Jika gambar PNG yang diunggah adalah gambar/png, itu adalah gambar/png. Setelah baris kosong dari jenis file, konten file yang diunggah juga mudah dimengerti. Dalam contoh ini, file teks yang diunggah adalah sehingga konten dapat ditampilkan secara langsung. Jika file gambar yang diunggah adalah file biner, fiddler akan menampilkan kode kacau. Setelah konten file berakhir, ada data batas plus batas.
Setelah memahami detail format pengiriman, langkah selanjutnya adalah menggunakan nodeJs untuk memprogram dan mengimplementasikannya. Sederhananya, cukup kirim data ke server sesuai dengan format.
const http = membutuhkan ('http'); const fs = membutuhkan ('fs'); // alamat posting adalah php dalam layanan lokal, yang digunakan untuk menguji apakah unggahannya berhasil var opsi = {hostname: 'localhost', port: 80, path: '/get.php', method:' post '}//generated data generated: varping = POSTEATED = POSTEATED:' POST '}/GENERATED: '--- webkitformboundaryjlvkbqxtiii0ygpab'; // Baca konten file yang perlu diunggah fs.readfile ('./ unggah. 'Tipe konten: teks/polos/r/n/r/n'; payload + = data; payload + = '/r/n--' + batas + '-'; // Kirim permintaan var req = http.request (opsi, fungsi (res) {res.setencoding ('UTF8'); res.on ('data) {res. chunk);});}); req.on ('error', function (e) {console.error ("error:"+e);}); // tulis batas, ukuran data yang akan dikirim, dan data itu sendiri ke dalam permintaan. Buffer.bytelength (payload, 'utf8')); req.write (payload); req.end ();});Fokus artikel ini adalah untuk memahami protokol dan mengimplementasikannya dengan kode. Masih ada banyak optimasi dalam organisasi kode.
Akhirnya, di Apache lokal, cukup tulis PHP untuk menyimpan file yang diunggah untuk digunakan sebagai tes:
<? php $ filePath = './upload.txt';move_uploaded_file($_files['myfile' versiadmp_name'], $ filepath); echo "ok";?>
Selain itu, menurut RFC 1867, fungsi mengunggah beberapa file sekaligus dapat direalisasikan. Ini tidak akan dijelaskan secara rinci di sini. Jika perlu, lihat RFC 1867 untuk implementasi terperinci.
Di atas adalah unggahan file node.js yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!