Ошибка недействительного boundary для запроса multipart/form-data в Axum

Вопрос или проблема

Итак, я пытаюсь загрузить файл на сервер. Я использую Postman для тестирования загрузки файлов, но получаю ошибку “Недопустимый `boundary` для запроса `multipart/form-data`” в Postman с кодом статуса HTTP 400. Вот мой код:

async fn main() {
    let paths = Router::new()
        .route("/upload", post(upload))
        .layer(DefaultBodyLimit::disable())
        .layer(RequestBodyLimitLayer::new(250 * 1024 * 1024));

    let listener = TcpListener::bind("0.0.0.0:3000").await.unwrap();

    axum::serve(listener, paths).await.unwrap();
}

async fn upload(mut files: Multipart) -> impl IntoResponse {
    while let Some(field) = files.next_field().await.unwrap() {
        let name = field.file_name().unwrap().to_string();
        println!("{name}, {}", field.content_type().unwrap());
    }

    StatusCode::OK
}

В Postman HTTP-запрос представляет собой POST-запрос, который содержит form-data в теле. Ключ – fileupload, а значение – 2 файла.

Что означает эта ошибка и как я могу ее решить?

Правка: Вот как выглядит HTTP-запрос Postman:

POST /upload HTTP/1.1
Host: localhost:3000
Content-Length: 418
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="fileupload"; filename="1ef9fae3-1302-4760-849c-1b1a73c36d70"
Content-Type: <Content-Type header here>

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="fileupload"; filename="1ef9facc-6eae-4990-9203-292653b9662f"
Content-Type: <Content-Type header here>

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Вот как выглядит тело запроса в Postman:
Тело запроса

Вот как выглядят заголовки в запросе к Postman:
Заголовки запроса

Похоже, проблема может быть связана с тем, что Postman не может определить, каков Content-Type каждого файла, так как у вашего имени файла нет расширения.

Content-Type: <Content-Type header here> должно быть заполнено типом содержимого файла: Content-Type: text/plain.

Попробуйте либо добавить расширение к имени файла, чтобы помочь Postman идентифицировать его, либо перейдите на вкладку Body, нажмите кнопку “…” в правом верхнем углу таблицы и проверьте столбец “Content-Type”, чтобы отобразить его. Затем просто явно укажите тип содержимого ваших файлов.

Как установить явный content-type

Ответ или решение

Ошибка "Неверная boundary для запроса multipart/form-data" в Axum: Возможные причины и решения

При попытке загрузить файл на сервер с использованием библиотеки Axum возникла ошибка "Неверная boundary для запроса multipart/form-data" и код состояния HTTP 400. В этой статье мы рассмотрим, что означает эта ошибка, возможные причины её возникновения и способы её устранения.

Что такое boundary?

Boundary – это специальная строка, используемая для разделения различных частей данных в запросе multipart/form-data. В запросах с файлом boundary указывается в заголовке Content-Type и используется для определения начала и конца каждой части данных. Например, в вашем случае Content-Type выглядит так:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

Причины возникновения ошибки

  1. Неправильный формат тела запроса: Если формат тела запроса не соответствует указанному boundary, сервер не сможет корректно обработать Multipart данные.

  2. Не указанный Content-Type для файлов: В вашем запросе вы указали <Content-Type header here>, что может привести к тому, что сервер не сможет определить тип загружаемого файла. Это может быть причиной ошибки в обработке данных.

  3. Ошибки при отправке данных с помощью Postman: Если Postman некорректно обрабатывает данные, это может привести к неверной интерпретации boundary.

Способы решения проблемы

1. Убедитесь, что Content-Type для файлов указан верно

Проверьте, чтобы каждый файл, отправляемый в вашем запросе, имел корректно указанный заголовок Content-Type. Если в Postman файлы загружаются без расширения или без автономного определения типа, укажите тип явно. Например:

Content-Type: application/pdf

или

Content-Type: image/png

2. Проверьте правильность формирования тела запроса

Убедитесь, что в вашем запросе нет лишних пробелов или отсутствующих boundary между частями данных. Он должен выглядеть, как указано ниже:

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="fileupload"; filename="example.png"
Content-Type: image/png

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

3. Измените настройки в Postman

Если вы продолжаете сталкиваться с проблемами, попробуйте изменить параметры в Postman:

  • Выделите файл, который вы загружаете, и проверьте столбец Content-Type. Это даст вам возможность установить тип файла вручную.

  • Также измените метод отправки, если используете не стандартный POST, можно попробовать переключиться на PUT или другой метод, чтобы исключить возможные ошибки.

Заключение

Ошибка "Неверная boundary для запроса multipart/form-data" может возникать по множеству причин, однако основные проблемы чаще всего связаны с некорректным указанием Content-Type для загружаемых файлов или неправильным форматом тела запроса. Корректировая эти настройки, вы сможете решить возникшие сложности и успешно выполнить загрузку файлов на сервер.

Оцените материал
Добавить комментарий

Капча загружается...