Java 文件分块上传服务器端源代码
本博客将介绍如何进行文件的分块上传。如果读者还想了解文件的“分块”下载相关内容可以去参考博客《Java 服务器端支持断点续传的源代码【支持快车、迅雷】》。
本文侧重介绍服务器端,客户端端请参考本篇博客的姊妹篇《Java 文件分块上传客户端源代码》,关于分块上传的思想及其流程,已在该博客中进行了详细说明,这里不再赘述。
直接上代码。接收客户端 HTTP 分块上传请求的 Spring MVC 控制器源代码如下:
/** * 组装文件 * */private void assembleFileWithBlock(BlockPreuploadFileInfo preUpload) {String dirPath = preUpload.getDirPath();// 开始在指定目录组装文件String uploadedUrl = null;String[] separatedFiles;String[][] separatedFilesAndSize;int fileNum = 0;File file = new File(dirPath);separatedFiles = file.list();separatedFilesAndSize = new String[separatedFiles.length][2];Arrays.sort(separatedFiles);fileNum = separatedFiles.length;for (int i = 0; i < fileNum; i++) {separatedFilesAndSize[i][0] = separatedFiles[i];String fileName = dirPath + separatedFiles[i];File tmpFile = new File(fileName);long fileSize = tmpFile.length();separatedFilesAndSize[i][1] = String.valueOf(fileSize);}RandomAccessFile fileReader = null;RandomAccessFile fileWrite = null;long alreadyWrite = 0;int len = 0;byte[] buf = new byte[1024];try {uploadedUrl = Global.UPLOAD_ABSOLUTE_PAHT_ + Global.PATH_SEPARATIVE_SIGN + preUpload.getUid() + Global.PATH_SEPARATIVE_SIGN + preUpload.getUuid();fileWrite = new RandomAccessFile(uploadedUrl, "rw");for (int i = 0; i < fileNum; i++) {fileWrite.seek(alreadyWrite);// 读取fileReader = new RandomAccessFile((dirPath + separatedFilesAndSize[i][0]), "r");// 写入while ((len = fileReader.read(buf)) != -1) {fileWrite.write(buf, 0, len);}fileReader.close();alreadyWrite += Long.parseLong(separatedFilesAndSize[i][1]);}fileWrite.close();preUpload.setStatus(Global.ASSEMBLED);preUpload.setServerPath(uploadedUrl);getBaseDao().update("upload.updatePreUploadInfo", preUpload);if(Global.BLOCK_UPLOAD_TO!=Global.BLOCK_UPLOAD_TO_LOCAL){//组装完毕没有问题 删除掉S2/S3上的blockString[] path=preUpload.getS3BlockUrl();for (String string : path) {try {if(Global.BLOCK_UPLOAD_TO==Global.BLOCK_UPLOAD_TO_S2){S2Util.deleteFile(preUpload.getBucketUrl(), string);}else{S3Util.deleteFile(preUpload.getBucketUrl(), string);}} catch (Exception e) {log.error(e.getMessage(), e);}}}if (log.isInfoEnabled())log.info(preUpload.getUuid() + " assembleFileWithBlock");} catch (IOException e) {log.error(e.getMessage(), e);try {if (fileReader != null) {fileReader.close();}if (fileWrite != null) {fileWrite.close();}} catch (IOException ex) {log.error(e.getMessage(), e);}}}