大家好,我是java小白,最近研究了http分段下载,但是自己写的代码运行后下载的文件不能打开。文件数据大小和网上文件是一样的,所以我没有找到原因,在此求教,谢谢。
以下是我的函数,
- Java code
public String upload(URL url) throws IOException{ String fileName = url.getFile(); InputStream in = null; final long size = 1024*5; if(fileName.equals("")){ throw new IOException("upload webfile \"" + fileName + "\" failed"); } HttpURLConnection con = (HttpURLConnection) url.openConnection(); long total = con.getContentLength(); System.out.println("file size is "+total); String newFileName = null; con.disconnect(); if(total<=size){ con = (HttpURLConnection) url.openConnection(); con.connect(); in = con.getInputStream(); return upload(fileName, in); }else { long part = total%size != 0 ? total/size+1 : total/size; long len; byte[] b = null; for(int i = 0; i< part;i++){ len = i!=part-1 ? size : total%size; b = new byte[IoUtils.safeLongToInt(len)]; //con.setConnectTimeout(30000); con.setReadTimeout(30000); //设置传输位置 con.setRequestProperty("RANGE","bytes=" + i*size + "-" + (i*size+len-1) + "/" + total); //设置请求信息 con.setRequestProperty("GET","/large/774fca33gw1dozmkrsu6ej.jpg HTTP/1.1"); //设置接受信息 con.setRequestProperty("[code=Java]Accept
//设置连接信息
con.setRequestProperty("Connection","Keep-Alive");
//con.setRequestProperty("RANGE","bytes " + i*size + "-" + (i*size+len-1) + "/" + total);
// 获得输入流
con.connect();
in = con.getInputStream();
DataInputStream dis = new DataInputStream(in);
RandomAccessFile oSavedFile = new RandomAccessFile("C:/bbb.jpg","rw");
//FileOutputStreamWrite fout = new FileOutputStream(oSavedFile);
long nPos = i*size;
// 定位文件指针到 nPos 位置
oSavedFile.seek(nPos);
// 从输入流中读入字节流,然后写到文件中
dis.read(b,0,IoUtils.safeLongToInt(len));
oSavedFile.write(b);
con.disconnect();
}
in.close();
return newFileName;
}
}[/code]
------解决方案--------------------------------------------------------
这里有误
// 从输入流中读入字节流,然后写到文件中
dis.read(b,0,IoUtils.safeLongToInt(len));
并不是每次你让他读多少他就正好读多少数据进来,所以要在这里做个循环,一直读完。
- Java code
int wlen = 0; while (wlen < len) { int read = bis.read(b, 0, len); wlen += read; oSavedFile.write(b, 0, read); }