春ブーツ、大きなファイルアップロードの実装(B)

コントローラ

 

@ApiOperation(値= "分片上传文件")
@PostMapping( "/インポート/アップロード/断片")
@RequiresAuthentication
公衆結果<UploadResultModel> fragmentUpload(FragmentUploadModel uploadModel、ストリングPARENTID)スローBusinessException {
JsonSuccess(personKnowledgeService.fragmentUpload(uploadModelを返します、PARENTID))。
}


サービス实现方法
/ ** 
*分片上传文件
*
* @param uploadModel
* /
@Override
公共UploadResultModel fragmentUpload(FragmentUploadModel uploadModel、ストリングPARENTID)スローBusinessException {
文字列のtaskId = uploadModel.getTaskId()。
//上传临时文件目录
文字列TMPPATH = ImportExportConstants.IMPORT_BASE_PATH +のtaskId + "/" + ImportExportConstants.PART_PATH。
CommonUtils.createDir(TMPPATH)。

文字列関数savepath = TMPPATH + uploadModel.getChunk()。

試す{
Files.write(Paths.get(関数savepath)、uploadModel.getFile()GetBytesメソッド())。
}キャッチ(IOExceptionを電子){
e.printStackTrace();
ヌルを返します。
}

ブールcheckResult = checkIsUploadComplete(uploadModel)。
(checkResult){もし
mergeAndAnalysis(uploadModel)。
addPersonKnowledgeRecord(uploadModel、PARENTID)。
}
UploadResultModel resultModel =新しいUploadResultModel()。
resultModel.setChunks(uploadModel.getChunks())。
resultModel.setOriginalFilename(uploadModel.getFile()getOriginalFilename()。)。
resultModel.setPart(uploadModel.getPart())。
resultModel.setTaskId(uploadModel.getTaskId())。

resultModelを返します。
}

/ **
*检查是否上传完成
*
* @param uploadModel
* @return
* /
プライベートブールcheckIsUploadComplete(FragmentUploadModel uploadModel){
文字列のtaskId = uploadModel.getTaskId()。
//上传临时文件目录
文字列basePathを= ImportExportConstants.IMPORT_BASE_PATH +のtaskId + "/";

partDirファイル=新しいファイル(basePathを+ ImportExportConstants.PART_PATH)。


ファイル[]ファイル=のpartDir.listFiles();
(もし!ファイル== nullの|| files.length = uploadModel.getChunks()){
falseを返します。
}
trueを返します。
}

/ **
*合并上传文件分片并解析
*
* @param uploadModel
* @return
* /
@Override
公共ボイドmergeAndAnalysis(FragmentUploadModel uploadModel)がスローBusinessException {
ストリングのtaskId = uploadModel.getTaskId()。
//上传临时文件目录
文字列basePathを= ImportExportConstants.IMPORT_BASE_PATH +のtaskId + "/";

//合并分片
ファイルmergeFile = mergeFiles(basePathを、uploadModel)。

BASEDIRファイル=新しいファイル(basePathを);
ファイル[]ファイル=のbaseDir.listFiles();

(ファイル== null)の場合は、{
新しいBusinessException投げる(OpsErrorMessage.MODULE_NAME、OpsErrorMessage.ERROR_MESSAGE、 "内容为を空!");
}
}

プライベートファイルmergeFiles(文字列basePathを、FragmentUploadModel uploadModel)がスローBusinessException {
ファイルpartDir =新しいファイル(basePathを+ ImportExportConstants.PART_PATH)。
destFile =新しいファイルをファイル(basePathを+ uploadModel.getName());


ファイル[]ファイル=のpartDir.listFiles();
もし(ファイル== nullの|| files.length = uploadModel.getChunks()!){
( "文件上传失败!"、OpsErrorMessage.MODULE_NAME、OpsErrorMessage.ERROR_MESSAGE)新しいBusinessException投げます。
}

(のFileOutputStreamアウト=新しいのFileOutputStream(destFile、真)){試みる
一覧<ファイル>部品= Lists.newArrayList(ファイル);
parts.sort(Comparator.comparingInt(O - > Integer.valueOf(o.getName())))。

(ファイル部分:部品)のための{
FileUtils.copyFile(アウト部分)。
}
}キャッチ(例外e){
( "文件上传失败!"、OpsErrorMessage.MODULE_NAME、OpsErrorMessage.ERROR_MESSAGE)新しいBusinessExceptionを投げます。
}最後に{
//删除分片文件
試す{
FileUtils.deleteDirectory(partDir)。
}キャッチ(IOExceptionを電子){
e.printStackTrace();
}
}

戻りdestFile。
}

プライベートボイドaddPersonKnowledgeRecord(FragmentUploadModel uploadModel、ストリングPARENTID){
文字列のtaskId = uploadModel.getTaskId()。
//上传临时文件目录
文字列basePathを= ImportExportConstants.IMPORT_BASE_PATH +のtaskId + "/";
//添加记录
文字列filename = uploadModel.getName()。
PersonKnowledgeモデル=新しいPersonKnowledge();
model.setCreateTime(新しいDate());
model.setCreateId(SecurityUtils.getSubject()GETCURRENTUSER()のgetId());
IF(StringUtils.isEmpty(PARENTID)){
PARENTID = "ルート"。
}
model.setParentId(PARENTID)。
model.setAttchmentType(PersonKnowledgeType文件.getId()。)。
ストリングsuffixName = fileName.substring(fileName.lastIndexOf() "");
model.setName(fileName.substring(0、fileName.lastIndexOf()) ""); //新文件名
model.setAttachmentPath(basePathを+ファイル名); //文件路径
model.setSuffix(suffixName.toLowerCase()サブストリング(1))。
//获取文件大小
ロングサイズ= uploadModel.getSize();
文字列fileSizeString = "";
DecimalFormat DF =新しいのDecimalFormat( "#00。");
もし(サイズ!= NULL){
場合(サイズ<1024){
fileSizeString = df.format((ダブル)サイズ)+ "B"。
model.setFileSize(fileSizeString)。
}ほか(サイズ<1048576){もし
fileSizeString = df.format((ダブル)サイズ/ 1024)+ "K"。
model.setFileSize(fileSizeString)。
}そうであれば(サイズ<1073741824){
fileSizeString = df.format((ダブル)サイズ/ 1048576)+ "M"。
model.setFileSize(fileSizeString)。
}他{
fileSizeString = df.format((ダブル)サイズ/ 1073741824)+ "G"。
model.setFileSize(fileSizeString)。
}
}
personKnowledgeRepository.save(モデル)。
}

参数モデル

@ApiModel(説明= "フラグメントアップロードファイルモデル")
パブリッククラスFragmentUploadModel {
/ **
*フラグメントアップロードファイル
* /
@ApiModelProperty(値= "フラグメントアップロードファイル")
プライベートファイルMultipartFile;
/ **
*タスクIDをアップロード
* /
@ApiModelProperty(値= "アップロードID")
プライベート文字列taskld;
/ **
*フラグメントの数
* /
@ApiModelProperty(値= "フラグメント番号")
チャンクのプライベートは整数であり;
/ **
*フラグメント番号
* /
@ApiModelProperty(値=「スライスID」)
プライベート整数チャンク;

@ApiModelProperty(値=「ファイル名」)
プライベート文字列名。
@ApiModelProperty(値= "ファイルサイズ")
プライベートロングサイズ。

プライベート文字列の一部。

パブリック整数GetChunkメソッド(){
戻りチャンク。
}

公共ボイドsetChunk(整数チャンク){
this.chunk =チャンク。
}

公共MultipartFileはgetFile(){
戻りファイル。
}

公共ボイドsetFile(MultipartFileファイル){
this.file =ファイル。
}

パブリック文字列あるgettaskid(){
のtaskIdを返します。
}

公共ボイドsetTaskId(文字列のtaskId){
this.taskId =のtaskId。
}

パブリック整数getChunks(){
戻りチャンク。
}

公共ボイドsetChunks(整数チャンク){
this.chunks =チャンク;
}

パブリック文字列あるgetPart(){
リターン部と
}

公共ボイドsetPart(列部分){
this.part =部と
}

パブリック文字列のgetName(){
戻り名。
}

公共ボイドのsetName(文字列名){
this.name =名。
}

パブリックロングのgetSize(){
戻りサイズ;
}

公共ボイドのsetSize(ロングサイズ){
this.size =サイズ。
}
}

おすすめ

転載: www.cnblogs.com/gaozs/p/11514430.html