我正在使用Jersey创建RESTful Web服务。一些资源是二进制文件,我可以根据需要从其他地方获取;这样的文件可能很大(几百MB)。
我希望浏览器获取这些资源,因此我有一个@ GET注释的方法返回StreamingOutput,就像在this answer中一样。
我有两个问题:
答案 0 :(得分:1)
只需使用与范围相关的HTTP标头,请注意w.r.t.缓存。首先,通过设置Accept-Ranges标题来宣传您可以恢复。其次,检查Range和If-Range标头,并发送相应的响应。
请注意,您可能需要构建自己的Response并手动设置所需的标头和结果代码。
答案 1 :(得分:0)
出于同样的目的,我构建了一个window.location.hostname.match(/[^\.]+\.[^\.]+$/)
来拦截带有ContainerResponseFilter
标头的请求,并相应地修改了响应[1]。
这是Range
,它将使用ContainerResponseFilter
封装输出流(见下文):
RangedOutputStream
这里是public class RangeResponseFilter implements ContainerResponseFilter {
private static final String RANGE = "Range";
private static final String ACCEPT_RANGES = "Accept-Ranges";
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
if (requestContext.getHeaders().containsKey(RANGE)) {
String rangeHeader = requestContext.getHeaderString(RANGE);
String contentType = responseContext.getMediaType().toString();
OutputStream originOutputStream = responseContext.getEntityStream();
RangedOutputStream rangedOutputStream = new RangedOutputStream(originOutputStream, rangeHeader, contentType, responseContext.getHeaders());
responseContext.setStatus(Status.PARTIAL_CONTENT.getStatusCode());
responseContext.getHeaders().putSingle(ACCEPT_RANGES, rangedOutputStream.getAcceptRanges());
responseContext.setEntityStream(rangedOutputStream);
}
}
}
:
RangedOutputStream