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

时间:2018-12-05 23:47:56

标签: java curl video file-upload inputstream

我有一个方法,该方法接受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 :(得分: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