【问题标题】:Download large video file getting corrupted下载大型视频文件损坏
【发布时间】:2018-06-05 21:53:06
【问题描述】:

在服务器端代码中,我将缓冲区大小和内容长度设置为 File.length(),然后使用 FileInputStream 打开文件。 稍后使用 HttpResponse.getOutputStream() 获取输出流并转储使用 FileInputStream

读取的数据字节

我正在使用 Apache Tomcat 7.0.52、Java 7


在客户端
文件下载器.java

URL url = new URL("myFileURL");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setDoInput(true);
con.setConnectTimeout(10000);
con.setReadTimeout(10000);
con.setRequestMethod("GET");
con.setUseCaches(false);
con.setRequestProperty("User-Agent", "Mozilla/5.0");
con.connect();
FileOutputStream fos = new FileOutputStream("filename");
if(con.getResponseCode()==200){
    InputStream is = con.getInputStream();
    int readVal;
    while((readVal=is.read())!=-1) fos.write(readVal);
}
fos.flush()
fos.close();

所以上面的代码无法下载大文件。 在使用 Java 7 的客户端上

【问题讨论】:

  • 请阅读minimal reproducible example 并相应地增强您的问题。 “下载失败”不是准确的问题描述。
  • 你刚刚编辑了你的代码之后 @lance-java 答案。我认为这不是一个好习惯。

标签: java tomcat


【解决方案1】:

你可以试试这个

 FileOutputStream outputStream = new FileOutputStream(fileName);
 int bytesRead;
 byte[] buffer = new byte[1024];
 while ((bytesRead = inputStream.read(buffer)) != -1) {
     outputStream.write(buffer, 0, bytesRead);
 }

引用https://stackoverflow.com/a/45453874/4121845

因为您只想写入实际读取的数据。考虑输入由 N 个缓冲区加一个字节组成的情况。如果没有 len 参数,您将写入 (N+1)*1024 字节而不是 N*1024+1 字节。还要考虑从套接字读取的情况,或者实际上是读取的一般情况: InputStream.read() 的实际约定是它传输至少一个字节,而不是填充缓冲区。通常它不能,出于某种原因。

【讨论】:

  • 以上代码有效,但我不明白它是如何创建损坏的数据的。如果我从引用的事情中理解的是正确的,这意味着说最后一个缓冲区会有垃圾数据。那是如何损坏我的文件的。当文件在本地复制时,它永远不会发生。你能告诉我更多信息吗@acxz94
【解决方案2】:
    fos.flush();
} finally {
    fos.close();
    con.close();
} 

【讨论】:

  • 虽然正确并且可能适当地考虑了在问题中所付出的努力,但也许除了代码转储之外再详细说明一下会有所帮助:)
  • 好的@Ben,你能推荐一个主题吗?
猜你喜欢
  • 1970-01-01
  • 2015-08-07
  • 2020-08-11
  • 2015-07-14
  • 2015-07-16
  • 2017-12-04
  • 2019-01-28
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多