如何在不丢失元数据的情况下从 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
我有一个方法可以接受 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