У меня есть сервер Node (ExpressJS), выполняющий роль прокси-сервера между веб-браузером и сервером Django (Django Rest Framework - DRF).Сервер DRF API имеет конечную точку POST - /api/upload/
, и базовое представление использует классы синтаксического анализатора MultiPartParser и FormParser.
Веб-браузер -> отправляет (файл изображения) -> Сервер узла -> отправляет (файл изображения) -> Django Rest Server
Идеальный поток запросов:
- Пользователь в браузере выбирает изображение.
- Пользователь отправляет выбранное изображение (объект файла JS) отдельно от multipart /данные формы.
- Узел (с Multer) сервер анализирует запрос на две части: req.file и req.body , где req.file содержит объект изображения (содержимое объекта изображения показано ниже).
- Используя модуль запроса, отправьте почтовый запрос на сервер Django на
POST - /api/upload/
. - 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);
}
);
});