gpt4 book ai didi

android - URLConnection.getContentLength() 返回 -1

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:48:10 25 4
gpt4 key购买 nike

我有一个 URL,当我在浏览器中输入该 URL 时,它可以完美地打开图像。但是当我尝试下面的代码时,我得到的 getContentLength() 为 -1:

URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

// determine the image size and allocate a buffer
int fileSize = connection.getContentLength();

请指导我这背后的原因是什么?

最佳答案

如果服务器使用 Chunked Transfer Encoding 发送响应,您将无法预先计算尺寸。响应是流式传输的,您只需分配一个缓冲区来存储图像,直到流完成为止。请注意,只有当您可以保证图像足够小以适合内存时,您才应该这样做。如果图像可能很大,将响应流式传输到闪存是一个非常合理的选择。

内存解决方案:

private static final int READ_SIZE = 16384;

byte[] imageBuf;
if (-1 == contentLength) {
byte[] buf = new byte[READ_SIZE];
int bufferLeft = buf.length;
int offset = 0;
int result = 0;
outer: do {
while (bufferLeft > 0) {
result = is.read(buf, offset, bufferLeft);
if (result < 0) {
// we're done
break outer;
}
offset += result;
bufferLeft -= result;
}
// resize
bufferLeft = READ_SIZE;
int newSize = buf.length + READ_SIZE;
byte[] newBuf = new byte[newSize];
System.arraycopy(buf, 0, newBuf, 0, buf.length);
buf = newBuf;
} while (true);
imageBuf = new byte[offset];
System.arraycopy(buf, 0, imageBuf, 0, offset);
} else { // download using the simple method

理论上,如果 Http 客户端将自己呈现为 HTTP 1.0,大多数服务器将切换回非流模式,但我认为 URLConnection 不会有这种可能性。

关于android - URLConnection.getContentLength() 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10439829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com