2016-05-17 2 views
0

У меня есть этот код до сих пор, но не могу получить бинарность Buffer.Как загрузить файл в node.js с помощью http-модуля?

var http = require('http'); 
var myServer = http.createServer(function(request, response) 
{ 
    var data = ''; 

    request.on('data', function (chunk){ 
     data += chunk; 
    }); 

    request.on('end',function(){ 

     if(request.headers['content-type'] == 'image/jpg') { 

      var binary = Buffer.concat(data); 

      //some file handling would come here if binary would be OK 

      response.write(binary.size) 
      response.writeHead(201) 
      response.end() 
     } 

Но получить эту ошибку: throw new TypeError('Usage: Buffer.concat(list, [length])');

ответ

1

Вы делаете три плохие вещи:

  1. Использование API неправильно буфера - отсюда и сообщение об ошибке.
  2. Конкатенация двоичных данных в виде строк
  3. Буферизация данных в памяти

Мукеш занималась # 1, поэтому я рассмотрю более глубокие проблемы.

Сначала вы получаете двоичные файлы Buffer и преобразуете их в строки с кодировкой по умолчанию (utf8), а затем объединяете их. Это повредит ваши данные. Помимо существующих байтовых последовательностей, которые не являются допустимыми utf8, если допустимая последовательность разрезается пополам куском, вы также потеряете эти данные.

Вместо этого вы должны хранить данные всегда как двоичные данные. Поддерживайте массив из Buffer, которому вы производите push каждый кусок, затем объединяйте их всех в конце.

Это приводит к проблеме №3. Вы буферизируете всю загрузку в память, а затем записываете ее в файл, вместо того чтобы передавать ее непосредственно в (временный) файл. Это накладывает большую нагрузку на ваше приложение, как с использованием памяти, так и с использованием времени, выделяющего все это. Вы должны указать piperequest в выходной поток файла, а затем проверить его на диске.

Если вы принимаете только очень маленькие файлы, вы можете уйти с сохранением их в памяти, но вам нужно защитить себя от клиентов, отправляющих слишком много данных (и, действительно, о том, сколько они собираются отправить).

+0

отличный ответ :) –

Смежные вопросы