Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pms-ci-test
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
test-ci
pms-ci-test
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
;
package
com
.
mmc
.
pms
.
controller
;
import
com.aliyun.oss.ClientException
;
import
com.aliyun.oss.OSS
;
import
com.aliyun.oss.OSS
;
import
com.aliyun.oss.OSSClientBuilder
;
import
com.aliyun.oss.OSSClientBuilder
;
import
com.aliyun.oss.OSSException
;
import
com.aliyun.oss.model.*
;
import
com.aliyun.oss.model.*
;
import
com.mmc.pms.common.ResultBody
;
import
com.mmc.pms.common.ResultBody
;
import
com.mmc.pms.json.JsonUtil
;
import
com.mmc.pms.json.JsonUtil
;
...
@@ -9,12 +11,15 @@ import com.mmc.pms.redis.RedisConstant;
...
@@ -9,12 +11,15 @@ import com.mmc.pms.redis.RedisConstant;
import
com.mmc.pms.util.OssConstant
;
import
com.mmc.pms.util.OssConstant
;
import
com.mmc.pms.util.PartUploadInfo
;
import
com.mmc.pms.util.PartUploadInfo
;
import
com.mmc.pms.util.TDateUtil
;
import
com.mmc.pms.util.TDateUtil
;
import
com.mmc.pms.util.XmlUtil
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
org.springframework.web.multipart.MultipartFile
;
import
springfox.documentation.annotations.ApiIgnore
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.File
;
import
java.io.File
;
...
@@ -23,6 +28,7 @@ import java.io.IOException;
...
@@ -23,6 +28,7 @@ import java.io.IOException;
import
java.io.InputStream
;
import
java.io.InputStream
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.List
;
import
java.util.UUID
;
/**
/**
* @Author small @Date 2023/5/23 13:46 @Version 1.0
* @Author small @Date 2023/5/23 13:46 @Version 1.0
...
@@ -30,10 +36,12 @@ import java.util.List;
...
@@ -30,10 +36,12 @@ import java.util.List;
@Api
(
tags
=
{
"分片上传"
})
@Api
(
tags
=
{
"分片上传"
})
@RestController
@RestController
@RequestMapping
(
"/partupload"
)
@RequestMapping
(
"/partupload"
)
@Slf4j
public
class
PartUploadController
{
public
class
PartUploadController
{
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
@ApiIgnore
@ApiOperation
(
value
=
"初始化分片上传"
)
@ApiOperation
(
value
=
"初始化分片上传"
)
@GetMapping
(
"/initPartUpload"
)
@GetMapping
(
"/initPartUpload"
)
public
ResultBody
initPartUpload
(
@RequestParam
String
fileName
,
HttpServletRequest
httpRequest
)
{
public
ResultBody
initPartUpload
(
@RequestParam
String
fileName
,
HttpServletRequest
httpRequest
)
{
...
@@ -74,7 +82,7 @@ public class PartUploadController {
...
@@ -74,7 +82,7 @@ public class PartUploadController {
.
set
(
RedisConstant
.
createPartUploadKey
(
uploadId
),
JsonUtil
.
parseObjToJson
(
pinfo
));
.
set
(
RedisConstant
.
createPartUploadKey
(
uploadId
),
JsonUtil
.
parseObjToJson
(
pinfo
));
return
ResultBody
.
success
(
uploadId
);
return
ResultBody
.
success
(
uploadId
);
}
}
@ApiIgnore
@ApiOperation
(
value
=
"进行片段上传"
)
@ApiOperation
(
value
=
"进行片段上传"
)
@PostMapping
(
"/partUpload"
)
@PostMapping
(
"/partUpload"
)
public
ResultBody
partUpload
(
public
ResultBody
partUpload
(
...
@@ -138,6 +146,7 @@ public class PartUploadController {
...
@@ -138,6 +146,7 @@ public class PartUploadController {
return
ResultBody
.
success
();
return
ResultBody
.
success
();
}
}
@ApiIgnore
@ApiOperation
(
value
=
"上传到阿里云oss"
)
@ApiOperation
(
value
=
"上传到阿里云oss"
)
@PostMapping
(
"/oss"
)
@PostMapping
(
"/oss"
)
public
ResultBody
oss
(
public
ResultBody
oss
(
...
@@ -221,4 +230,95 @@ public class PartUploadController {
...
@@ -221,4 +230,95 @@ public class PartUploadController {
ossClient
.
shutdown
();
ossClient
.
shutdown
();
return
ResultBody
.
success
();
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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论