Часть кода:
package org.example;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.MediaType;
import java.util.List;
import java.util.Map;
import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
@Path("/hello")
public class ExampleResource {
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void hello(@MultipartForm MultipartFormDataInput formDataInput) {
Map dataMap = formDataInput.getFormDataMap();
List inputs = dataMap.get("attachment");
System.out.println("Data map: " + dataMap);
System.out.println("Data inputs: " + inputs);
}
}
Шаг воспроизведения:
- Создайте оба файла с разными именами и одним расширением для сравнения: Новый_документ. docx и New_document.docx.
- Как только оба будут созданы, попробуйте загрузить их с помощью почтальона с вложением key

- Отладьте данные и посмотрите, что formDataInput.getFormDataMap () метод dataMap возвращает действительно странный ключ, закодированный с помощью UTF-8, и он обрезан, потому что у него есть .doc вместо .docx. Я предполагаю, что ключом карты является значение filename*=UTF-8, взятое из заголовка Content-Disposition.

Inputs имеет значение null.

- Проделайте то же самое с именем файла ASCII New_document.docx. И обратите внимание на ту же карту. На данный момент ожидаемый ключ и входные данные не равны нулю

[img]https://i.sstatic.net. /nSv9qE2P.png[/img]
Итак, моя проблема: когда я пытаюсь загрузить любой файл с именем файла, отличным от ASCII, я не могу получить ключ вложения из formDataInput. результат метода getFormDataMap().
Я попробовал использовать несколько подходов для ее решения:
- Было добавлено
@Consumes(MediaType.MULTIPART_FORM_DATA + ";charset=utf-8")
вместо
@Consumes(MediaType.MULTIPART_FORM_DATA) - Добавлена реализация ContainerRequestFilter:
import static org.jboss.resteasy.plugins.providers.multipart.InputPart.DEFAULT_CHARSET_PROPERTY;
import static org.jboss.resteasy.plugins.providers.multipart.InputPart.DEFAULT_CONTENT_TYPE_PROPERTY;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class ContainerRequestFilterImpl implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.setProperty(DEFAULT_CONTENT_TYPE_PROPERTY, "multipart/form-data;charset=utf-8");
requestContext.setProperty(DEFAULT_CHARSET_PROPERTY, "utf-8");
}
}
Я понятия не имею, что я сделал не так и как это исправить.
Использовано:
io.quarkus:quarkus-bom:3.13.0
org.jboss.resteasy:resteasy-multipart-provider:6.2.9.Final
Подробнее здесь: https://stackoverflow.com/questions/788 ... me-quarkus