Вот моя конечная точка spring boot для публикации file и object в одном запросе
@PostMapping(
value = ["/add"],
consumes = [
MediaType.MULTIPART_FORM_DATA_VALUE,
MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE,
MediaType.APPLICATION_OCTET_STREAM_VALUE
]
)
fun addUser(
@RequestPart("user") user: UserDTO,
@RequestPart("file") file: MultipartFile,
): Long = userService.addUser(user, file)
И это прекрасно работает, когда я использую postman вот так:
Как я могу добиться точно такой же конфигурации с помощью axios. Я пробовал много решений, и каждый раз я получаю сообщение об ошибке:
org.apache.tomcat.util.http.fileupload.impl.InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded
Или это:
org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
Вот моя axios просьба
const file = new FormData()
file.append('file', photo, photo.name)
const response = await axios.post(
'/user/add',
JSON.stringify({
user,
file
}),
{
withCredentials: true,
}
)
Я также пробовал это:
const file = new FormData()
file.append('file', photo, photo.name)
const response = await axios.post(
'/user/add',
{
user,
file
},
{
withCredentials: true,
}
)
Я также попытался установить content-type на multipart/form-data
Чтобы установить тип содержимого, вы должны передать файловый объект. Это можно сделать с помощью Blob. для например.
const user = {
username: "user123"
};
const json = JSON.stringify(user);
const blob = new Blob([json],{
type: 'application/json'
});
const body = new FormData();
body.append("user" ,blob);
body.append("file" ,photo);
axios({
method: 'post',
url: '/user/add',
data: body,
});
Работает идеально, большое спасибо. Я бы никогда не подумал о таком решении