/**
* 分片上传逻辑
*/
public void saveFileAsPatch(String uploadFileId, HttpServletRequest request, String accountId) {
// 分片上传
if (StringUtils.isEmpty(uploadFileId)) {
throw new InvalidParamException("uploadFileId");
}
UploadFile uploadFile = lambdaQuery().eq(UploadFile::getId, uploadFileId).one();
if (null == uploadFile) {
throw new GeneralException(ErrorCode.ERROR_FILE_NOT_EXIST);
}
if (StringUtils.isEmpty(uploadFile.getPath())) {
String fileName = getFileName(request.getHeader("Upload-Name"));
uploadFile.setPath(getDirFilePath() + "/" + getUUIDFileName(fileName));
updateById(uploadFile);
}
long uploadOffset = Long.parseLong(request.getHeader("Upload-Offset"));
File localFile = new File(uploadFile.getPath());
ServletInputStream inputStream = null;
try {
inputStream = request.getInputStream();
writeFile(localFile, inputStream, uploadOffset);
} catch (Exception e) {
log.error("File write error:{}", e.getMessage());
} finally {
try {
if (null != inputStream) {
inputStream.close();
}
} catch (Exception e) {
log.error("ServletInputStream close error:{}", e.getMessage());
}
}
// 等文件上传结束后,再检验文件是否重复
if (uploadFile.getSize().equals(localFile.length())) {
String fileName = getFileName(request.getHeader("Upload-Name"));
uploadFile.setName(fileName);
handleFileNameAndFileContent(uploadFile, accountId, localFile);
}
}
/**
* 写入文件
*/
void writeFile(File localFile, InputStream inputStream, long uploadOffset) {
// 每片大小限制 300MB
int chunkSize = 1024 * 1024 * 300;
try (RandomAccessFile accessFile = new RandomAccessFile(localFile, "rw");
ByteArrayOutputStream baos = new ByteArrayOutputStream(chunkSize)
) {
byte[] bytes = new byte[1024];
int len;
while ((len = inputStream.read(bytes)) != -1) {
baos.write(bytes, 0, len);
}
accessFile.seek(uploadOffset);
accessFile.write(baos.toByteArray());
} catch (Exception e) {
log.error("Sharded storage error:{}", e.getMessage());
}
}