Как сохранить видеофайл из InputStream без потери метаданных? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть метод, который принимает файл в форме InputStream и возвращает это InputStream обратно пользователю.Когда пользователь сохраняет видеофайл обратно с InputStream, видеофайл не может быть воспроизведен.Метод, который получает и возвращает файл, выглядит следующим образом:

@RequestMapping(value = "/file_redirect", method = RequestMethod.POST)
public ResponseEntity fileRedirect(HttpServletRequest request) throws Exception{

    InputStreamResource inputStreamResource = new InputStreamResource(request.getInputStream());

    return new ResponseEntity(inputStreamResource, HttpStatus.OK);
}

Я использую curl для отправки запроса и получения файла:

curl -X POST -H "content-length: 389907412" -H "Content-Type: multipart/form-data" -F "data=@/path/to/file/myVideo.mp4" -o returnedVideo.mp4 localhost/file_redirect

Я также пробовал этометод (размер файла правильный):

@RequestMapping(value = "/file_redirect", method = RequestMethod.POST)
public ResponseEntity fileRedirect(HttpServletRequest request) throws Exception{

    InputStreamResource inputStreamResource = new InputStreamResource(request.getInputStream());

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentLength(389907412);
    httpHeaders.setContentType(new MediaType("video", "mp4"));

    return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);    
}

Оба метода «работают» и файл успешно сохранен, но после этого его невозможно воспроизвести.Размер возвращаемого файла правильный.Метаданные возвращенного файла утеряны.Тип файла как для исходного, так и для возвращаемого файла: MPEG-4 video (video/mp4).Контрольные суммы исходного файла и возвращаемого файла различны.

Что я делаю не так при сохранении файла?Почему метаданные теряются в возвращаемом файле?

1 Ответ

0 голосов
/ 06 декабря 2018

Проблема была в самом запросе curl, а не в контроллере.Кажется, что данные были отправлены как поле data, поэтому, когда я получал InputStream в контроллере, InputStream содержал поле data с самим значением (файлом).Для отправки данных без полей нам нужно использовать следующую команду:

curl -X POST -H "content-length: 389907412" --data-binary "@/path/to/file/myVideo.mp4" -o returnedVideo.mp4 localhost/file_redirect
...