注:
这里只是讨论一种文件分块上传的方案(解决方案并不唯一)
1、需要服务端支持
如何通知服务端,客户端对于上传文件分了几片?
如何通知服务端,当前为上传文件的第几片?
可将以下数据放到post请求的body中解决以上问题:
{
"file_md5": "xxxx", //完整文件的md5
"total_count": 5, //总的分片数
"current_index": 3, //当前分片位置,从1开始
"file": file //分片文件,表单方式提交
}
2、客户端的代码
// long seekStart 文件上传的开始位置
// long seekEnd 文件上传的结束位置
//-----skip到指定位置-----
long nowSeek = seekStart;
FileInputStream in = new FileInputStream(file);
if (seekStart > 0) {
long amt = in.skip(seekStart);
if (amt == -1) {
nowSeek = 0;
}
}
//上传时buffer的大小为BUFFER_SIZE_DEFAULT
int len;
byte[] buf = new byte[BUFFER_SIZE_DEFAULT];
while ((len = in.read(buf)) >= 0 && nowSeek < seekEnd) {
dataOutStream.write(buf, 0, len);
nowSeek += len;
// 如果数据不足BUFFER_SIZE_DEFAULT,则减小buffer
if (nowSeek + BUFFER_SIZE_DEFAULT > seekEnd) {
buf = new byte[Integer.valueOf((seekEnd - nowSeek) + "")];
}
}