Можно ли перенаправить поток из одной функции в другую?

Пожалуйста, посмотрите на следующий пример кода.

Как видите, он использует busboy для анализа входящих данных формы и записи входящих файлов на диск. Давайте предположим, что это просто файлы изображений, потому что мой пример кода использует imgur.com. (заголовок длины содержимого отправлять не нужно) Функция imgurUpload() использует данные узла формы

Можно ли как-то дополнительно передавать файлы изображений без необходимости их полной буферизации на imgur.com? (в функцию imgurUpload() и использовать ее в узле-форме-данных?)

Сервер / слушатель:

var http = require('http'),
  Busboy = require('busboy'),
  FormData = require('form-data'),
  fs = require('fs')

http.createServer(function(req, res) {
  if (req.method === 'POST') {
    var busboy = new Busboy({
      headers: req.headers
    })
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
      //pipe the stream to disc
      file.pipe(fs.createWriteStream('1st-' + filename))
      //pipe the stream a 2nd time
      file.pipe(fs.createWriteStream('2nd-' + filename))

      /* how to connect things together? */
    })
    busboy.on('finish', function() {
      res.writeHead(200, {
        'Connection': 'close'
      })
      res.end("upload complete")
    })
    return req.pipe(busboy)
  } else if (req.method === 'GET') {
    var stream = fs.createReadStream(__dirname + '/index.html')
    stream.pipe(res)
  }
}).listen(80, function() {
  console.log('listening for requests')
})

HTML тестовая форма (index.html)

<!doctype html>
<head></head>
<body>
  <form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="submit">
  </form>
</body>
</html>

Пример функции, которая отправляет файл изображения на imgur.com:

function imgurUpload(stream) {

  var form = new FormData()
  //form.append('Filedata', fs.createReadStream('test.jpg'))

  form.append('Filedata', /* how to connect things together? */X )
  form.submit('http://imgur.com/upload', function(err, res) {
    if (err) throw err

    var body = ''
    res.on('data', function(chunk) { body += chunk })
    res.on('end', function() { console.log('http://imgur.com/' + JSON.parse(body).data.hash) })
  })
}

Обновление (относительно ответа mscdex)

_stream_readable.js:748
    throw new Error('Cannot switch to old mode now.');
          ^
Error: Cannot switch to old mode now.
    at emitDataEvents (_stream_readable.js:748:11)
    at FileStream.Readable.pause (_stream_readable.js:739:3)
    at Function.DelayedStream.create (\path\node_modules\form-data\node_modules\combined-stream\node_modules\delayed-stream\lib\delayed_stream.js:35:12)
    at FormData.CombinedStream.append (\path\node_modules\form-data\node_modules\combined-stream\lib\combined_stream.js:45:30)
    at FormData.append (\path\node_modules\form-data\lib\form_data.js:43:3)
    at imgurUpload (\path\app.js:54:8)
    at Busboy.<anonymous> (\path\app.js:21:4)
    at Busboy.emit (events.js:106:17)
    at Busboy.emit (\path\node_modules\busboy\lib\main.js:31:35)
    at PartStream.<anonymous> (\path\node_modules\busboy\lib\types\multipart.js:205:13)

1 ответ

Вы можете добавлять читаемые потоки, как показано на node-form-dataЧитаем. Итак, это:

form.append('Filedata', stream);

должно работать просто отлично.

Тогда в вашем file обработчик события:

imgurUpload(file);
Другие вопросы по тегам