SpringMVC断点下载代理中转 无法成功设置206响应码

oulaly 发布于 2017/11/03 17:47
阅读 214
收藏 0

浏览器客户端,访问应用服务器,带上文件url地址参数。

应用服务器代理下载url文件,最终返回给浏览器,弹出下载。

下载需要支持断点(Range、Content-Range),响应码设为206。

 

正如下面示意代码中的注释所描述的:

如果设置206响应码放在数据读写IOUtils.copy前,chrome下载会立即提示“失败-未发现文件“。
如果设置206响应码放在IOUtils.copy后,则最终实际的响应码却是200,而不是206,断点下载文件会有异常。

 

这是为什么?如何实现才能满足需求?

 

@RequestMapping(value = "/download", method = RequestMethod.GET)
@ResponseBody
public void download(HttpServletRequest request, HttpServletResponse response, String url) {
	final URL urlObj = new URL(url);

	final HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
	connection.setRequestProperty("Cache-Control", "no-cache");
	connection.setRequestProperty("Connection", "keep-alive");
	connection.setRequestProperty("Range", request.getHeader("Range"));

	connection.setDoOutput(false);
	connection.setDoInput(true);
	connection.setUseCaches(false);
	connection.setConnectTimeout(TIMEOUT);
	connection.setReadTimeout(TIMEOUT);

	response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
	response.setContentLength(connection.getContentLength());
	response.setHeader("Connection", "keep-alive");
	response.setHeader("Accept-Ranges", "bytes");
	response.setHeader("Content-Range", connection.getHeaderField("Content-Range"));
	response.setHeader("Content-Disposition", "attachment; filename=test.mp4");
		
	// 设置206响应码:
	// 如果放在数据读写IOUtils.copy前(即这里),chrome下载提示“失败-未发现文件”
	// 如果放在IOUtils.copy后,则最终实际的响应码却是200,而不是206,断点下载文件会有异常
	response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

	IOUtils.copy(connection.getInputStream(), response.getOutputStream());

	response.flushBuffer();
}

以下是问题补充:

@oulaly:经测试,将设置响应码206的语句放在写数据语句前,只在chrome中存在问题,IE11、Firefox56、迅雷9都可以正常下载。 这是怎么回事呢? (2017/11/06 15:25)
@oulaly:还有个问题:大文件下载,比如1G以上,在chrome中下载一阵后,chrome就提示”失败-文件下载未完成“,而java服务器这边没有出现任何异常日志信息,其他浏览器没有试过 (2017/11/06 17:38)
加载中
返回顶部
顶部