Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pms
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
iuav
pms
Commits
ff7ad2c1
提交
ff7ad2c1
authored
6月 15, 2023
作者:
张小凤
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Multipart upload(add)
上级
c40fbf42
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
101 行增加
和
1 行删除
+101
-1
PartUploadController.java
...ain/java/com/mmc/pms/controller/PartUploadController.java
+101
-1
没有找到文件。
src/main/java/com/mmc/pms/controller/PartUploadController.java
浏览文件 @
ff7ad2c1
package
com
.
mmc
.
pms
.
controller
;
import
com.aliyun.oss.ClientException
;
import
com.aliyun.oss.OSS
;
import
com.aliyun.oss.OSSClientBuilder
;
import
com.aliyun.oss.OSSException
;
import
com.aliyun.oss.model.*
;
import
com.mmc.pms.common.ResultBody
;
import
com.mmc.pms.json.JsonUtil
;
...
...
@@ -9,12 +11,15 @@ import com.mmc.pms.redis.RedisConstant;
import
com.mmc.pms.util.OssConstant
;
import
com.mmc.pms.util.PartUploadInfo
;
import
com.mmc.pms.util.TDateUtil
;
import
com.mmc.pms.util.XmlUtil
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
springfox.documentation.annotations.ApiIgnore
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.File
;
...
...
@@ -23,6 +28,7 @@ import java.io.IOException;
import
java.io.InputStream
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.UUID
;
/**
* @Author small @Date 2023/5/23 13:46 @Version 1.0
...
...
@@ -30,10 +36,12 @@ import java.util.List;
@Api
(
tags
=
{
"分片上传"
})
@RestController
@RequestMapping
(
"/partupload"
)
@Slf4j
public
class
PartUploadController
{
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
@ApiIgnore
@ApiOperation
(
value
=
"初始化分片上传"
)
@GetMapping
(
"/initPartUpload"
)
public
ResultBody
initPartUpload
(
@RequestParam
String
fileName
,
HttpServletRequest
httpRequest
)
{
...
...
@@ -74,7 +82,7 @@ public class PartUploadController {
.
set
(
RedisConstant
.
createPartUploadKey
(
uploadId
),
JsonUtil
.
parseObjToJson
(
pinfo
));
return
ResultBody
.
success
(
uploadId
);
}
@ApiIgnore
@ApiOperation
(
value
=
"进行片段上传"
)
@PostMapping
(
"/partUpload"
)
public
ResultBody
partUpload
(
...
...
@@ -138,6 +146,7 @@ public class PartUploadController {
return
ResultBody
.
success
();
}
@ApiIgnore
@ApiOperation
(
value
=
"上传到阿里云oss"
)
@PostMapping
(
"/oss"
)
public
ResultBody
oss
(
...
...
@@ -221,4 +230,95 @@ public class PartUploadController {
ossClient
.
shutdown
();
return
ResultBody
.
success
();
}
@PostMapping
(
"/multipartUpload"
)
public
ResultBody
multipartUpload
(
@RequestParam
(
"multipartUpload"
)
MultipartFile
uploadFile
,
HttpServletRequest
request
)
throws
IOException
{
OSS
ossClient
=
new
OSSClientBuilder
()
.
build
(
OssConstant
.
ENDPOINT
,
OssConstant
.
ACCESSKEYID
,
OssConstant
.
ACCESSKEYSECRET
);
File
file
=
XmlUtil
.
ossUpload
(
uploadFile
);
String
oldName
=
uploadFile
.
getOriginalFilename
();
String
newName
=
"file/"
+
UUID
.
randomUUID
().
toString
()
+
oldName
.
substring
(
oldName
.
lastIndexOf
(
"."
),
oldName
.
length
());
String
location
=
null
;
try
{
// 创建InitiateMultipartUploadRequest对象。
InitiateMultipartUploadRequest
requests
=
new
InitiateMultipartUploadRequest
(
OssConstant
.
BUCKET
,
newName
);
// 初始化分片。
InitiateMultipartUploadResult
upresult
=
ossClient
.
initiateMultipartUpload
(
requests
);
// 返回uploadId,它是分片上传事件的唯一标识。您可以根据该uploadId发起相关的操作,例如取消分片上传、查询分片上传等。
String
uploadId
=
upresult
.
getUploadId
();
List
<
PartETag
>
partETags
=
new
ArrayList
<
PartETag
>();
final
long
partSize
=
1
*
1024
*
1024L
;
//1 MB。
// 根据上传的数据大小计算分片数。以本地文件为例,说明如何通过File.length()获取上传数据的大小。
final
File
sampleFile
=
new
File
(
file
.
toString
());
long
fileLength
=
sampleFile
.
length
();
int
partCount
=
(
int
)
(
fileLength
/
partSize
);
if
(
fileLength
%
partSize
!=
0
)
{
partCount
++;
}
// 遍历分片上传。
for
(
int
i
=
0
;
i
<
partCount
;
i
++)
{
long
startPos
=
i
*
partSize
;
long
curPartSize
=
(
i
+
1
==
partCount
)
?
(
fileLength
-
startPos
)
:
partSize
;
UploadPartRequest
uploadPartRequest
=
new
UploadPartRequest
();
uploadPartRequest
.
setBucketName
(
"pad-video-x"
);
uploadPartRequest
.
setKey
(
newName
);
uploadPartRequest
.
setUploadId
(
uploadId
);
// 设置上传的分片流。
// 以本地文件为例说明如何创建FIleInputstream,并通过InputStream.skip()方法跳过指定数据。
InputStream
instream
=
new
FileInputStream
(
sampleFile
);
instream
.
skip
(
startPos
);
uploadPartRequest
.
setInputStream
(
instream
);
// 设置分片大小。除了最后一个分片没有大小限制,其他的分片最小为100 KB。
uploadPartRequest
.
setPartSize
(
curPartSize
);
// 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出此范围,OSS将返回InvalidArgument错误码。
uploadPartRequest
.
setPartNumber
(
i
+
1
);
// 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。
UploadPartResult
uploadPartResult
=
ossClient
.
uploadPart
(
uploadPartRequest
);
// 每次上传分片之后,OSS的返回结果包含PartETag。PartETag将被保存在partETags中。
partETags
.
add
(
uploadPartResult
.
getPartETag
());
}
CompleteMultipartUploadRequest
completeMultipartUploadRequest
=
new
CompleteMultipartUploadRequest
(
OssConstant
.
BUCKET
,
newName
,
uploadId
,
partETags
);
// 完成分片上传。
CompleteMultipartUploadResult
completeMultipartUploadResult
=
ossClient
.
completeMultipartUpload
(
completeMultipartUploadRequest
);
log
.
info
(
completeMultipartUploadResult
.
getETag
());
location
=
completeMultipartUploadResult
.
getLocation
();
}
catch
(
OSSException
oe
)
{
log
.
info
(
"Caught an OSSException, which means your request made it to OSS, "
+
"but was rejected with an error response for some reason."
);
log
.
info
(
"Error Message:"
+
oe
.
getErrorMessage
());
log
.
info
(
"Error Code:"
+
oe
.
getErrorCode
());
log
.
info
(
"Request ID:"
+
oe
.
getRequestId
());
log
.
info
(
"Host ID:"
+
oe
.
getHostId
());
}
catch
(
ClientException
ce
)
{
log
.
info
(
"Caught an ClientException, which means the client encountered "
+
"a serious internal problem while trying to communicate with OSS, "
+
"such as not being able to access the network."
);
log
.
info
(
"Error Message:"
+
ce
.
getMessage
());
}
finally
{
if
(
ossClient
!=
null
)
{
ossClient
.
shutdown
();
}
}
deleteFile
(
file
);
return
ResultBody
.
success
(
location
);
}
private
void
deleteFile
(
File
...
files
)
{
for
(
File
file
:
files
)
{
if
(
file
.
exists
())
{
file
.
delete
();
}
}
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论