Передача запроса multipart / form-data к другому запросу при изменении имен некоторых полей в Node.js - PullRequest
1 голос
/ 26 сентября 2019

Я хочу передать запрос на загрузку файла в multipart / form-data на другой сервер и одновременно изменить имя некоторых полей.

Я не хочу временно хранить файл на диске и не могуНе хочу хранить файл полностью в памяти.

Я пытался использовать multer, busboy и multiparty.Я думаю, что стал ближе, используя пользовательские потоки Transform, но это пока не работает.

const express = require('express');
const request = require('request');
const { Transform } = require('stream');

const router = express.Router();

class TransformStream extends Transform {
  _transform(chunk, encoding, callback) {
    // here I tried to manipulate the chunk
    this.push(chunk);
    callback();
  }

  _flush(callback) {
    callback();
  }
}

router.post('/', function pipeFile(req, res) {
  const transformStream = new TransformStream();
  req.pipe(transformStream).pipe(request.post('http://somewhere.com'));
  res.sendStatus(204);
});

Я пытался манипулировать кусками в _transform без успеха (EPIPE).Звучит довольно странно, есть ли лучшие решения?

1 Ответ

1 голос
/ 26 сентября 2019

Вот решение, использующее replacestream вместе с content-disposition.

const replaceStream = require('replacestream');
const contentDisposition = require('content-disposition');

router.post('/', function pipeFile(req, res) {

  let changeFields = replaceStream(/Content-Disposition:\s+(.+)/g, (match, p1) => {
    // Parse header
    let {type, parameters} = contentDisposition.parse(p1);

    // Change the desired field
    parameters.name = "foo";

    // Prepare replacement
    let ret = `Content-Disposition: ${type}`;
    for(let key in parameters) {
      ret += `; ${key}="${parameters[key]}"`;
    }

    return ret;
  })

  req.pipe(changeFields)
  .pipe(request.post('http://somewhere.com'))
  .on('end', () => {
    res.sendStatus(204);
  });
});
...