Java 文件分块上传服务器端源代码(二)
tempFileName = UUID.randomUUID().toString();// 94d1d2e0-9aad-4dd8-a0f6-494b0099ff26
} else {// myvedio.flv
tempFileName = UUID.randomUUID() + fileName.substring(pointPosition);// 94d1d2e0-9aad-4dd8-a0f6-494b0099ff26.flv
}
try {
outputStream = new FileOutputStream(Global.UPLOAD_TEMP_DIR + tempFileName);
int readBytes = 0;
byte[] buffer = new byte[10000];
while ((readBytes = inputStream.read(buffer, 0, 10000)) != -1) {
outputStream.write(buffer, 0, readBytes);
}
return tempFileName;
} catch (IOException ioe) {
// log.error(ioe.getMessage(), ioe);
throw new BaseException(BaseException.ERROR_CODE_20020);// 上传文件不存在
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
}
}
}
}
/**
* 测试此服务是否可用
*
* @param response
* @return
* @author zwq7978
*/
@RequestMapping("/core/v1/file/testServer")
@ResponseBody
public Object testServer(HttpServletResponse response) {
setHttpStatusOk(response);
return Global.SUCCESS_RESPONSE;
}
public UploadService getUploadService() {
return uploadService;
}
public void setUploadService(UploadService uploadService) {
this.uploadService = uploadService;
}
public void setAuthService(AuthService authService) {
this.authService = authService;
}
public AuthService getAuthService() {
return authService;
}
}
比如要上传的文件是 test450k.mp4。对照《
Java 文件分块上传客户端源代码》中分块上传服务器对分块文件参数定义的名字"file",upload 方法里使用的是 MultipartFile 接收该对象。对于每次的 HTTP 请求,使用 copyFile 方法将文件流输出到服务器本地的一个临时文件夹里,比如作者的是 D:/defonds/syncPath/uploadTemp,该文件下会有 50127019-b63b-4a54-8f53-14efd1e58ada.mp4 临时文件生成用于保存上传文件流。
分块依次上传。当所有块都上传完毕之后,将这些临时文件都转移到服务器指定目录中,比如作者的这个目录是 D:/defonds/syncPath/file,在该文件夹下会有/1/temp_dir_5_1 目录生成,而 uploadTemp 的临时文件则被挨个转移到这个文件夹下,生成形如 5.part0001 的文件。以下是文件转移的源代码:
[java]
/**
* 把所有块从临时文件目录移到指定本地目录或S2/S3
*
* @param preUpload
*/
private void moveBlockFiles(BlockPreuploadFileInfo preUpload) {
@SuppressWarnings("unchecked")
String[] s3BlockUrl=new String[preUpload.getBlockNumber()];
String[] localBlockUrl=new String[preUpload.getBlockNumber()];//本地的块文件路径 以便以后删除
List blocks = (List) getBaseDao().queryForList(
"upload.getBlockUploadFileByUuid", preUpload.getUuid());
String tempDirName = SyncUtil.getTempDirName(preUpload.getUuid(), preUpload.getUid());
String parentPath = Global.UPLOAD_ABSOLUTE_PAHT_ + Global.PATH_SEPARATIVE_SIGN
+ String.valueOf(preUpload.getUid());
String dirPath = parentPath + Global.PATH_SEPARATIVE_SIGN + tempDirName;
new File(dirPath).mkdirs();//创建存放块文件的文件夹 (本地)
int j=0;
for (BlockUploadInfo info : blocks) {
try {