java分包
發布時間: 2023-09-01 16:13:22
這個你是用什麼客戶端上傳呢?
java寫的客戶端和H5頁面都可以做這個操作,思路都是一樣的。
把文件切割再上傳,後台接受結束後再把文件合並。
在DB里做個記錄就是斷點續傳了嘛。
給點代碼提示:
js:
每次上傳2M,必須是支持H5的瀏覽器才行,兼容的問題需要注意!
functioncalculate(file,callBack){
varfileReader=newFileReader(),
blobSlice=File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice,
chunkSize=2097152,
//readinchunksof2MB
chunks=Math.ceil(file.size/chunkSize),
currentChunk=0,
spark=newSparkMD5();
fileReader.onload=function(e){
spark.appendBinary(e.target.result);//appendbinarystring
currentChunk++;
if(currentChunk<chunks){
loadNext();
}
else{
callBack(spark.end());
}
};
functionloadNext(){
varstart=currentChunk*chunkSize,
end=start+chunkSize>=file.size?file.size:start+chunkSize;
fileReader.readAsBinaryString(blobSlice.call(file,start,end));
};
loadNext();
}
java代碼沒什麼注釋,也不是全部的代碼看個大概意思,理解一下吧
根據文件的MD5碼來判斷每次上傳的文件是不是上傳過的。
如果是就找到上次的點告訴前台從哪開始上傳。
Messagemessage=newMessage();
PrintWriterout=response.getWriter();
=newServiceBreakpointUpload();
BreakpointShardshard=newBreakpointShard();
StringcurrentShardIndex="";
StringtotalShard="";
StringfileMD5="";
StringfileName="";
StringfileType="other";
try{
fileMD5=request.getParameter("fileMD5");
Partpart=request.getPart("fileData");
currentShardIndex=request.getParameter("currentShardIndex");
totalShard=request.getParameter("totalShard");
fileName=request.getParameter("fileName");
fileName=newString(fileName.getBytes("iso-8859-1"),"UTF-8");
fileType=request.getParameter("fileType");
StringtypeFolderName=service.getTypeFolder(fileType);
StringfolderPath=getServletContext().getRealPath("/upload/")+typeFolderName+File.separator;
Stringpath=folderPath+fileName+"-"+fileMD5+"-"+currentShardIndex;
System.out.println("fileName:"+fileName);
//是否初次上傳
if(!service.isUpload(fileMD5,fileType)){
BreakpointFilebreakpointFile=newBreakpointFile();
breakpointFile.setMd5(fileMD5);
breakpointFile.setFile_name(fileName);
breakpointFile.setTotal_shard(totalShard);
breakpointFile.setCurrent_shard_index(currentShardIndex);
breakpointFile.setFile_type(fileType);
breakpointFile.setPath(folderPath);
service.saveFile(breakpointFile);
}else{//返回上次完成位置
service.updateFile(fileMD5,currentShardIndex,fileType);
System.out.println("uploadshard"+currentShardIndex+"OK");
}
shard.setMd5(fileMD5);
shard.setShard_index(currentShardIndex);
shard.setPath(path);
service.saveShardFile(shard);
part.write(path);
if(currentShardIndex.equals(totalShard)){//上傳完成
System.out.println("");
service.mergeFiles(fileMD5,fileType);
System.out.println("mergeshardOK");
message.setData("completed");
}
message.setData(currentShardIndex);
out.println(JSONObject.fromObject(message).toString());
}catch(Exceptione){
e.printStackTrace();
message.setHasError(true);
message.setErrorMessage("錯誤!");
out.println(JSONObject.fromObject(message).toString());
}
}
2. Java工程搭建的時候,分包是模塊優先,還是分層優先
com.項目名.模塊.
這樣每個模塊可以單獨維護
熱點內容