我要确定类型的文件(一般UTF-8)通过阅读的第一部分的文件和分析的内容。(类型是具体到我的社区,但不在我的控制和未涵盖的MIME/MediaType这通常是TEXT_PLAIN).我使用的'组织。restlet图书馆在客户分析的头

Request request = new Request(Method.HEAD, url);

所以我知道的内容的长度和可能(如果必要和可能的)估计有多少字节我要下载的分析

澄清:我不能使用MediaType.从答案1似乎是我们得到的内容。经修订的问题,因此将是:

"我可以得到 一部分 一个文件使用Restlet?"

回答:以下代码不是我想要的。我已经记入@BalusC显示方式。请评论,如果我们错过了什么:

public String readFirstChunk(String urlString, int byteCount) {
    String text = null;
    if (urlString != null) {
        org.restlet.Client restletClient = new org.restlet.Client(Protocol.HTTP);
        Request request = new Request(Method.GET, urlString);
        List<Range> ranges = Collections.singletonList(new Range(0, byteCount));
        request.setRanges(ranges);
        Response response = restletClient.handle(request);
        if (Status.SUCCESS_OK.equals(response.getStatus())) {
            text = processSuccessfulChunkRequest(response);
        } else if (Status.SUCCESS_PARTIAL_CONTENT .equals(response.getStatus())) {
            text = processSuccessfulChunkRequest(response);
        } else {
            System.err.println("FAILED "+response.getStatus());
        }
    }
    return text;
}

private String processSuccessfulChunkRequest(Response response) {
    String text = null;
    try {
        text = response.getEntity().getText();
    } catch (IOException e) {
        throw new RuntimeException("Cannot download chunk", e);
    }
    return text;
}
有帮助吗?

解决方案

这是唯一可能的,如果服务器发出的 Accept-RangesContent-Range 随着头 ETagLast-Modified.E.g。

Accept-Ranges: bytes
Content-Range: bytes 0-1233/1234
ETag: file.ext_1234_1234567890

Accept-Ranges: bytes 表示服务器支持的请求返还部分内容在一个指定的字节的范围。的 Content-Range 标题通知有关的长度。的 ETagLast-Modified 指示的唯一文件idenfier或最后一次修改时间戳上的资源背后的请求URI。

如果这些头是存在的响应,然后你就可以请求一部分资源使用 If-RangeRange 请求头有分别的唯一文件标识或最后一次修改时间戳和所需的字节的范围。

If-Range: file.ext_1234_1234567890
Range: bytes=0-99

上面的例子返回的第一个100字节的文件。

其他提示

的HEAD操作中,由HTTP标准定义的不远离头部信息返回任何内容。因此,如果要发送一个请求头,你只能检查MIME类型从HTTP响应报头中的文件的

可以通过查看从包成一个ClientResource并执行头请求返回的表示来获得标题信息。这给你一个高级接口HTTP传输,你不需要做自定义标题的解析。

ClientResource resource = new ClientResource(url);
Representation representation = resource.head();
representation.getMediaType(); // returns the Media Type

如果你想要做的内容类型的猜测上的文件的实际内容,你需要下载的实际内容,例如使用针对资源的GET请求。

,还是在内心REST的方式,你可以为你的资源的额外查询参数这将返回您的自定义的元信息该文件,e.g。

模型
http://server/file?contentType

在类似的方式,以获取实际的内容,你可以得到的流的处理,然后做你的编码猜测。

Representation representation = resource.get();
InputStream stream = representation.getStream();

要指定范围,如果服务器支持,可以设置范围,提交您的GET请求之前。

List<Range> ranges = new ArrayList<Range>();
ranges.add(new Range(0,100)); // this would request the first 100 bytes
resource.setRanges(ranges);
Representation representation = resource.get();

确认你消耗的响应(流)完全,在返回之前。

我建议你看看其他的努力,帮助您确定的内容类型。 喜欢这里 Java的字符集和Windows http://glaforge.free.fr/wiki/index.php?wiki = GuessEncoding

由于这是您的内容,为什么不只是包括所有你在每个文件的前几个字节需要的数据?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top