如何在不丢失元数据的情况下从 InputStream 保存视频文件?

How to save a video file from an InputStream without loosing metadata?

我有一个方法可以接受 InputStream 形式的文件,并且 returns 这个 InputStream 返回给用户。当用户从 InputStream 保存视频文件时,视频文件无法播放。 接收和 returns 文件的方法如下所示:

@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);    
}

两种方法"works"都成功保存了文件,但之后无法播放。返回文件的文件大小是正确的。返回文件的元数据丢失。原始文件和返回文件的文件类型均为 MPEG-4 video (video/mp4)。原始文件和返回文件的校验和不同。

保存文件时我做错了什么?为什么元数据在返回的文件中丢失?

问题出在 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