java http 分段下载

fvn4edal 2012-05-16 03:02:49
大家好,我是java小白,最近研究了http分段下载,但是自己写的代码运行后下载的文件不能打开。文件数据大小和网上文件是一样的,所以我没有找到原因,在此求教,谢谢。
以下是我的函数,
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
","image/gif,image/x-xbitmap,application/msword,*/*");
//设置连接信息
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]
...全文
282 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fvn4edal 2012-07-18
  • 打赏
  • 举报
回复
谢谢,这个确实小白问题了。哈哈
tomcatlee 2012-05-17
  • 打赏
  • 举报
回复
这里有误
// 从输入流中读入字节流,然后写到文件中
dis.read(b,0,IoUtils.safeLongToInt(len));

并不是每次你让他读多少他就正好读多少数据进来,所以要在这里做个循环,一直读完。

int wlen = 0;
while (wlen < len) {
int read = bis.read(b, 0, len);
wlen += read;
oSavedFile.write(b, 0, read);
}

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧