我有一个方法,该方法接受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)
。原始文件和返回文件的校验和不同。
保存文件时我在做什么错?为什么元数据会在返回的文件中丢失?
答案 0 :(得分:0)
问题出在time=2018-12-07T09:18:02.846Z | lvl=WARN | corr=N/A | trans=N/A | from=N/A | srv=N/A | subsrv=N/A | comp=Orion | op=AlarmManager.cpp[405]:badInput | msg=Raising alarm BadInput 192.168.115.126: JSON Parse Error: unknown field: /timestamp
time=2018-12-07T09:18:02.847Z | lvl=WARN | corr=N/A | trans=N/A | from=N/A | srv=N/A | subsrv=N/A | comp=Orion | op=postQueryContext.cpp[196]:queryForward | msg=Internal Error (error parsing reply from prov app: )
请求本身而非控制器中。似乎数据是作为字段curl
发送的,这就是为什么当我在控制器中获取InputStream时,InputStream包含具有值(文件)本身的字段data
的原因。要发送没有字段的数据,我们需要使用下一条命令:
data