在Java中恢复HTTP文件下载
URL url = new URL("http://download.thinkbroadband.com/20MB.zip"); URLConnection connection = url.openConnection(); File fileThatExists = new File(path); OutputStream output = new FileOutputStream(path, true); connection.setRequestProperty("Range", "bytes=" + fileThatExists.length() + "-"); connection.connect(); int lenghtOfFile = connection.getContentLength(); InputStream input = new BufferedInputStream(url.openStream()); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; output.write(data, 0 , count); }
在这段代码中,我尝试恢复下载。 目标文件是20MB。 但是,当我停止下载10MB,然后contunue,我得到文件大小为30MB的文件。 它似乎继续写入文件,但不能从服务器部分下载。 Wget -c对这个文件很好用。 我怎样才能恢复文件下载?
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if(ISSUE_DOWNLOAD_STATUS.intValue()==ECMConstant.ECM_DOWNLOADING){ File file=new File(DESTINATION_PATH); if(file.exists()){ downloaded = (int) file.length(); connection.setRequestProperty("Range", "bytes="+(file.length())+"-"); } }else{ connection.setRequestProperty("Range", "bytes=" + downloaded + "-"); } connection.setDoInput(true); connection.setDoOutput(true); progressBar.setMax(connection.getContentLength()); in = new BufferedInputStream(connection.getInputStream()); fos=(downloaded==0)? new FileOutputStream(DESTINATION_PATH): new FileOutputStream(DESTINATION_PATH,true); bout = new BufferedOutputStream(fos, 1024); byte[] data = new byte[1024]; int x = 0; while ((x = in.read(data, 0, 1024)) >= 0) { bout.write(data, 0, x); downloaded += x; progressBar.setProgress(downloaded); }
这不是我的代码,但它的工作原理。
我想你正面临的问题是在url.openStream()
之后调用url.openConnection()
。
url.openStream()
相当于url.openConnection().getInputStream()
。 因此,你正在请求两次URL。 特别是第二次,它没有指定范围属性。 因此下载总是从头开始。
你应该用url.openStream()
replaceurl.openStream()
connection.getInputStream()
。
看看这个线程有一个类似于你的问题 。 如果wget正在工作,那么服务器显然支持恢复下载。 它看起来像你没有设置上述链接的接受答案中提到的If-Range
标题。 即。 加:
// Initial download. String lastModified = connection.getHeaderField("Last-Modified"); // ... // Resume download. connection.setRequestProperty("If-Range", lastModified);
由于这个问题被标记为Android:你有没有尝试过使用DownloadManager 。 它很好地处理所有这些东西。
这个怎么样?
public static void download(DownloadObject object) throws IOException{ String downloadUrl = object.getDownloadUrl(); String downloadPath = object.getDownloadPath(); long downloadedLength = 0; File file = new File(downloadPath); URL url = new URL(downloadUrl); BufferedInputStream inputStream = null; BufferedOutputStream outputStream = null; URLConnection connection = url.openConnection(); if(file.exists()){ downloadedLength = file.length(); connection.setRequestProperty("Range", "bytes=" + downloadedLength + "-"); outputStream = new BufferedOutputStream(new FileOutputStream(file, true)); }else{ outputStream = new BufferedOutputStream(new FileOutputStream(file)); } connection.connect(); inputStream = new BufferedInputStream(connection.getInputStream()); byte[] buffer = new byte[1024*8]; int byteCount; while ((byteCount = inputStream.read(buffer)) != -1){ outputStream.write(buffer, 0, byteCount); break; } inputStream.close(); outputStream.flush(); outputStream.close(); }
使用break;
testing代码..;)
我有一个方法让你的代码工作。
- 首先,检查文件是否退出
-
如果文件存在,请设置连接:
connection.setRequestProperty("Range", "bytes=" + bytedownloaded + "-");
-
如果文件不存在,请在新文件中进行相同的下载。