gpt4 book ai didi

java - 从 URL 读取 InputStream 并写入 HttpServletResponse 而不创建临时文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:32 27 4
gpt4 key购买 nike

我尝试从 URL 读取 InputStream 并直接写入 HttpServletResponse,而不在 HttpServlet 中创建临时文件,但未能获取文件的真实 Content-Length。有人告诉我,如果不读取流,我无法确定流中的数据量。有人能帮我吗?我真的很感激。

最佳答案

由于您是从 URL 读取内容,因此您应该从该 URL 的 Content-length header 中获取可用的长度。

HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.connect();
if ( connection.getResponseCode() == 200 ) {
int contentLength = connection.getContentLength();
response.setContentLength( contentLength );

请注意,您不应该使用inputStream.available()available() 方法仅告诉您可以在不阻塞的情况下读取多少字节(即等待下一个 block 从网络到达)。它不会告诉您流的大小!但在 HttpURLConnection 中,您可以使用 getContentLength() 方法获取内容长度 header 的值。

完成此操作后,您可以启动读写循环来复制所有数据,例如

InputStream source = connection.getInputStream();
OutputStream target = response.getOutputStream();

int FILE_CHUNK_SIZE = 1024 * 4;
byte[] chunk = new byte[FILE_CHUNK_SIZE];
int n =0;
while ( (n = source.read(chunk)) != -1 ) {
target.write(chunk, 0, n);
}

请记住使用 try-catch 来解决所有这些问题,因为在此类事务中可能会抛出多种异常。当您捕获异常时,请记住在响应中设置响应代码,该代码不是 200。

关于java - 从 URL 读取 InputStream 并写入 HttpServletResponse 而不创建临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39349993/

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