Я столкнулся с таким требованием в своей работе, и мне нужно было использовать Nodejs для загрузки файлов. Раньше я знал, как загружать файлы через браузер. Если я использую Nodejs, это эквивалентно моделированию поведения браузера. После Google я понял, что браузер просто использует протокол HTTP для передачи данных на сервер. Конкретный протокол - «RFC 1867 - загрузка файлов на основе форм в HTML». Загрузка файлов через формы в браузере проходит через этот протокол. Сначала мы можем увидеть, какие данные отправляет браузер на сервер, а затем мы можем реализовать функцию загрузки в соответствии с копией. Когда дело доходит до загрузки файлов в формы форм, все должны быть знакомы:
<form action = "http://www.qq.com/" method = "post"> <input type = "text" name = "text1" /> <br /> <input type = "text" name = "text2" /> <br /> <input type = "opper" /> < /form>
При отправке вы можете видеть, что следующие данные отправляются на сервер, используя Fiddler для захвата пакета:
Разместите http://www.qq.com/ http/1.1
Хост: www.qq.com
Длина контента: 23
Тип контента: приложение/x-www-form-urlencoded; charset = utf-8
Text1 = Hello & Text2 = мир
Стоит отметить, что по умолчанию контента по умолчанию приложение/X-WWW-Form-Urlencoded, поэтому сообщение будет кодировано URL. Например, «Привет» будет закодироваться как%E4%BD%A0%E5%A5%BD.
Далее, давайте посмотрим, как загружается форма. Все должны быть знакомы:
<form action = "http://www.qq.com" method = "post" enctype = "multiplat/form-data"> <input type = "file" name = "myfile"/> <input type = "value =" prope "/> </form>
Затем создайте новый текстовый файл opload.txt только с словом Hello World и загрузите его. Мы используем Fiddler, чтобы захватить пакет. Мы можем обнаружить, что отправка прошлых данных немного сложнее (было удалено множество других не связанных с ними линий запроса, таких как управление кешем и файлы cookie):
Разместите http://www.qq.com/ http/1.1
Хост: www.qq.com
Длина контента: 199
Контент-тип: Multipart/Form-Data; Boundary = --- webkitformboundwarwr3x7sxbyqq4zf5g
----- webkitformboundwr3x7sxbyqq4zf5g
Контент-распада: форм-дата; name = "myfile"; filename = "upload.txt"
Тип контента: текст/равнина
Привет, мир
----- webkitformboundwr3x7sxbyqqq4zf5g--
Согласно определению RFC 1867, нам нужно генерировать кусок граничных данных. Эти данные не могут появиться в другом месте в контенте. Это можно определить самостоятельно. Алгоритм генерации каждого браузера может отличаться. Вышеуказанная граница должна разделить данные. После генерации разделенных данных раздельные данные могут быть размещены в типе контента на головке и переданы на сервер, то есть вышеуказанный тип контента: Multipart/Form-Data; Boundary = --- WebKitFormBoundwr3x7sxbyQQ4ZF5G. Кроме того, загруженное содержание должно быть разделено на несколько сегментов с отдельными данными, и каждый сегмент данных имеет имя файла, и имя при загрузке. Сервер использует это имя для получения файла, а тип файла типа контента. В этом примере текст/равнина. Если загруженное изображение PNG - это изображение/PNG, это изображение/PNG. После пустой строки типа файла содержимое загруженного файла также легко понять. В этом примере загруженный текстовый файл содержится так, чтобы содержимое было отображено напрямую. Если загруженный файл изображения является двоичным файлом, Fiddler отобразит искаженную код. После того, как содержание файла заканчивается, есть пустая строка плюс граничные данные.
Понимая детали формата отправки, следующим шагом является использование Nodejs для программы и реализации его. Проще говоря, просто отправьте данные на сервер в соответствии с форматом.
const http = require ('http'); const fs = require ('fs'); // Пост -адрес является PHP в локальной службе, используемой для проверки того, является ли загрузка успешной var options = {hostname: 'localhost', порт: 80, path: '/get.php', method:' post '} // генерируют разделенные данные. '--- webkitformboundaryjlvkbqxtii0ygpab'; // Читать содержимое файла, которое необходимо загрузить fs.readfile ('./ upload.txt', function (err, data) {// выделять отдельный сегмент данных var pailload = '-' + boundarykey + '/r/n' + 'content-disposition: form-data; name = "myfile"; filename = "upload.txt"/r/n' + name = "myfile"; 'Content-type: Text/rain/r/n/r/n'; power загрузка + = data; powerload + = '/r/n--' + boundarykey + '-'; // Отправить запрос var req = http.request (опции, функция (res) {res.setencoding ('utf8'); res.on ('data', function) {consoste) {console. chunk);});}); req.on ('error', function (e) {console.error ("error:"+e);}); // Записать границу, размер данных, которые должны быть отправлены, и сами данные в запрос req.setheader ('content-type', 'Multipart/form-data; Boundary = '+boundarykey+' '); req.setheader (' content-juind ’, buffer.bytelength (powerlate, 'utf8')); req.write (payload); req.end ();});В центре внимания этой статьи - понять протокол и реализовать его с помощью кода. Есть еще много оптимизаций в организации кода.
Наконец, в локальном Apache просто напишите PHP, чтобы сохранить загруженный файл для использования в качестве теста:
<? php $ filePath = './upload.txt's;move_uploaded_file( 000
Кроме того, согласно RFC 1867, функция загрузки нескольких файлов одновременно может быть реализована. Это не будет подробно описано здесь. При необходимости обратитесь к RFC 1867 для подробной реализации.
Выше приведено загрузка файла node.js, представленная редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!