Загрузка FormData на Экспо - PullRequest
0 голосов
/ 29 апреля 2020

Используя expo, всякий раз, когда я запускаю почтовый запрос с объектом FormData с добавленным JSON и файлом изображения, я получаю

"error": "Unsupported Media Type",
  "message": "Content type 'application/octet-stream' not supported",
  "path": "/visitas/",
  "status": 415,
[…]

в качестве ответа от бэкэнда (который запускает Spring Boot) , но всякий раз, когда я повторяю запрос в HTTP-клиент (в данном случае, это бессонница), запрос следует как следует, и я могу получить и просмотреть изображение обратно, как и должно.

Код

Visitas.js

[…]
async function startVisita(checkin) {
// Checkin contains file uri and some other things
  try {
    const location = await getLocation();

    const formData = new FormData();
    formData.append('object',
      JSON.stringify({
        longitude: location.coords.longitude,
        latitude: location.coords.latitude,
        checkin: new Date(),
        loja: {id: loja.id},
      })
    );
    // object gets filled accondingly

    formData.append('imagecheckin', {
      uri: checkin.uri,
      name: 'imagem.jpg',   // I know the image is .jpg
      type: 'image/jpg',
    });
    // imagecheckin is a object inside formData (not a readStream as it normally would)

    console.log(formData);


    try {
      const response = await fetch(`${Endpoint.baseAddr}${Endpoint.visitas}`, {
        body: formData,
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'multipart/form-data',
          'Authorization': 'Bearer ' + await AsyncStorage.getItem('jwt'),
        },
      })
        .then(res => res.json());
      console.log(response);


    } catch (err) {
      console.error('Erro ao postar a visita! Erro causado:', err);
      console.log(err.res, err.response);
    }
  } catch (err) {
    console.error('Erro ao criar a visita! Erro causado:');
    console.error(err);
  }
}
[…]

ControllerImagens.java

[…]
@PostMapping
    public ResponseEntity<T> adicionarCheckin(
        @RequestPart(name = "imagecheckin", required = true) MultipartFile file,
        @RequestPart(name = "object", required = true) T objeto,
        @RequestHeader("authorization") String token) {
          // Calls constructors, validators and stuff
[…]

И данные, которые я получаю из журнала,

FormData {
  "_parts": Array [
    Array [
      "object",
      "{\"longitude\":-40.3097038,\"latitude\":-20.3758293,\"checkin\":\"2020-04-29T18:06:22.994Z\",\"loja\":{\"id\":1}}",
    ],
    Array [
      "imagecheckin",
      Object {
        "name": "imagem.jpg",
        "type": "image/jpg",
        "uri": "file:///data/user/0/host.exp.exponent/cache/ExperienceData/%2540anonymous%252Fproatend-f576a9db-3f86-4238-8677-3ebbd056f4ea/Camera/1f2192a7-fe81-40d1-8efd-9ff6a98a32a3.jpg",
      },
    ],
  ],
}
...