Как загрузить файл с Multer с сервера Node на сервер API Django? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть сервер Node (ExpressJS), выполняющий роль прокси-сервера между веб-браузером и сервером Django (Django Rest Framework - DRF).Сервер DRF API имеет конечную точку POST - /api/upload/, и базовое представление использует классы синтаксического анализатора MultiPartParser и FormParser.

Веб-браузер -> отправляет (файл изображения) -> Сервер узла -> отправляет (файл изображения) -> Django Rest Server

Идеальный поток запросов:

  1. Пользователь в браузере выбирает изображение.
  2. Пользователь отправляет выбранное изображение (объект файла JS) отдельно от multipart /данные формы.
  3. Узел (с Multer) сервер анализирует запрос на две части: req.file и req.body , где req.file содержит объект изображения (содержимое объекта изображения показано ниже).
  4. Используя модуль запроса, отправьте почтовый запрос на сервер Django на POST - /api/upload/.
  5. MultiPartParser DRF и FormParser успешно анализируют изображениефайл.

У меня проблема между шагами 3 и 4. Я не знаю, как преобразовать req.file в правильный формат для передачи функции Node's Request.post(), которая будет правильноразбирается по DRF.

Ниже, когда я отправляю imageFormData как есть, сервер Django на некоторое время останавливается, потому что содержимое данных формы слишком велико.Я предполагаю, что MultiPartParser и FormParser не распознают форму объекта данных и правильно его анализируют.

Содержимое req.file:

{ fieldname: 'profile_image',
  originalname: 'danny.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  buffer:
       <Buffer ff d8 ff e0 00 10 4a 46 49 46 00  ... >,
  size: 1894234 }

Конечная точка узла

app.use(bodyParser.json());

const formDataParser = multer();
app.use(formDataParser.single('profile_image'));

...

app.post('/api/upload/', (req, res) => {

    let imageFormData = {
        'profile_image': {
            value: req.file.buffer,
                options: {
                    filename: req.file.originalname,
                    contentType: req.file.mimetype
                }
            }
        }
    };

    request.post(
        {
            url: `http://127.0.0.1:8000/${req.url.path}`,
            json: true,
            headers: {
                ...req.headers
            },
            // Docs: https://github.com/request/request#multipartform-data-multipart-form-uploads
            formData: imageFormData
        },
        (err, {statusCode}, body) => {
            if (err) {
                res.status(500).json({'errors': {'message': 'Server Errors!'}});
            }

            res.status(statusCode).send(body);
        }
    );
});
...