Помощь с Restify Multipart form data Error 413

Задание закрыто
Стоимость:Договорная
Срок выполнения:1 день
Варианты оплаты:По договоренности
Дата публикации:2025-02-08 21:47
Был на сайте:2025-02-09 14:43

Помощь с Restify Multipart form data Error 413

 
Задача

Привет всем,

Требуется помощь разобраться почему не заливается файл размером 100 mb на Restify через Nginx из формы при помощи multipart form data.

Nginx log

127.0.0.1 - - [08/Feb/2025:12:37:46 +0000] "OPTIONS
/customers/63c2dcfaf11af09ce4a955fd/uploadMediaFile HTTP/1.0" 204 0
"https://myServer.live/" "Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U
Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Mobile
Safari/537.36"
Nginx server

server {
server_name api.myServer.live;
listen 80;
client_max_body_size 500M;

location / {
proxy_pass http://127.0.0.1:3000;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


access_log /var/log/nginx/apiMyServerLive-access.log;
error_log /var/log/nginx/apiMyServernLive-error.log;
}
}
Restify

const server = restify.createServer({});

server.use(
restify.plugins.bodyParser({
maxBodySize: 1000000,
}),
restify.plugins.queryParser({})
);
Загружаю файл

async function uploadMediaFi...

Видеть полную информацию и оставлять заявки могут только авторизованные пользователи.
Добрый вечер. Есть пару вариантов, накидаю их, если один будет правильный, и помогу решить проблему, вы оплачиваете
Чтобы решить ошибку 413 (Request Entity Too Large) при загрузке больших файлов через Restify и Nginx, внесите следующие изменения:

1. Исправление конфигурации Nginx
Добавьте `client_max_body_size` в блок `location /`:

server {
server_name api.myServer.live;
listen 80;

# Общий размер для всего сервера (можно продублировать в location для надежности)
client_max_body_size 500M;

location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# Явное указание для location
client_max_body_size 500M;

access_log /var/log/nginx/apiMyServerLive-access.log;
error_log /var/log/nginx/apiMyServernLive-error.log;
}
}

- Перезагрузите Nginx:

sudo nginx -s reload

2. Настройка Restify
Исправьте параметр `maxBodySize` в bodyParser. Значение должно быть в байтах:

const server = restify.createServer({});

server.use(
restify.plugins.bodyParser({
maxBodySize: 500 * 1024 * 1024, // 500 МБ
}),
restify.plugins.queryParser({})
);

- Перезапустите Restify-сервер.

3. Исправление фронтенда (Fetch-запрос)
Уберите заголовок `Content-Type` — браузер добавит его автоматически с правильным `boundary`:

const res = await fetch(GB.apiURL + "/customers/" + id + "/uploadMediaFile", {
method: "POST",
body: formData,
headers: {
Authorization: "jwt " + token,
// УДАЛИТЬ ЭТУ СТРОКУ: "Content-Type": "multipart/form-data",
},
});

4. Дополнительные проверки
- Убедитесь, что на диске достаточно места.
- Проверьте логи ошибок Nginx (`/var/log/nginx/apiMyServernLive-error.log`) на предмет других проблем.

Если ошибка сохраняется, сообщите — продолжим диагностику!

ТГ: @KuzyaevMaxim
Основные проблемы заключаются в следующем:

Ограничение размера запроса в Restify:
В конфигурации Restify для плагина bodyParser установлено значение

maxBodySize: 1000000,
Это означает, что сервер принимает запросы размером до ?1 МБ, что значительно меньше 100 МБ. Хотя в конфигурации Nginx лимит выставлен на 500 МБ, именно Restify ограничивает размер тела запроса. Решением будет увеличить параметр maxBodySize до значения, превышающего размер вашего файла (например, 150 * 1024 * 1024 для 150 МБ).

Ручная установка заголовка Content-Type при использовании FormData:
При отправке данных с помощью объекта FormData браузер автоматически формирует корректный заголовок Content-Type с нужными параметрами (границей multipart form data). Когда вы вручную указываете заголовок

"Content-Type": "multipart/form-data",
отсутствует необходимая информация о boundary, что может привести к неверной обработке данных сервером.

Рекомендации по исправлению:

Увеличьте лимит в Restify:
Измените конфигурацию плагина bodyParser, например, на

server.use(
restify.plugins.bodyParser({
maxBodySize: 150 * 1024 * 1024, // 150 МБ
}),
restify.plugins.queryParser({})
);
Это позволит принимать файлы большего размера.

Удалите ручную установку Content-Type:
При использовании FormData в fetch-запросе не устанавливайте заголовок Content-Type вручную. Достаточно удалить его из объекта headers, чтобы браузер мог установить его правильно:


const res = await fetch(GB.apiURL + "/customers/" + localStorage.getItem("id") + "/uploadMediaFile", {
method: "POST",
body: formData,
headers: {
Authorization: "jwt " + localStorage.getItem("token"),
// Не указывайте "Content-Type", браузер сам его добавит
},
});

Оставлять заявки могут только авторизованные пользователи.