Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hexbee
Cloudreve
提交
c4eada27
C
Cloudreve
项目概览
hexbee
/
Cloudreve
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Cloudreve
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c4eada27
编写于
2月 27, 2020
作者:
H
HFO4
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Modify: oss handle sign URL
上级
bd643fa2
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
96 addition
and
27 deletion
+96
-27
models/policy.go
models/policy.go
+3
-1
pkg/filesystem/driver/oss/handller.go
pkg/filesystem/driver/oss/handller.go
+49
-24
pkg/filesystem/upload.go
pkg/filesystem/upload.go
+1
-1
routers/controllers/admin.go
routers/controllers/admin.go
+11
-0
routers/router.go
routers/router.go
+2
-0
service/admin/policy.go
service/admin/policy.go
+30
-1
未找到文件。
models/policy.go
浏览文件 @
c4eada27
...
...
@@ -217,7 +217,9 @@ func (policy *Policy) GetUploadURL() string {
return
"/api/v3/file/upload"
case
"remote"
:
controller
,
_
=
url
.
Parse
(
"/api/v3/slave/upload"
)
case
"oss"
,
"cos"
:
case
"oss"
:
return
"https://"
+
policy
.
BucketName
+
"."
+
policy
.
Server
case
"cos"
:
return
policy
.
BaseURL
case
"upyun"
:
return
"http://v0.api.upyun.com/"
+
policy
.
BucketName
...
...
pkg/filesystem/driver/oss/handller.go
浏览文件 @
c4eada27
...
...
@@ -49,6 +49,30 @@ const (
VersionID
key
=
iota
)
// CORS 创建跨域策略
func
(
handler
*
Driver
)
CORS
()
error
{
// 初始化客户端
if
err
:=
handler
.
InitOSSClient
();
err
!=
nil
{
return
err
}
return
handler
.
client
.
SetBucketCORS
(
handler
.
Policy
.
BucketName
,
[]
oss
.
CORSRule
{
{
AllowedOrigin
:
[]
string
{
"*"
},
AllowedMethod
:
[]
string
{
"GET"
,
"POST"
,
"PUT"
,
"DELETE"
,
"HEAD"
,
},
ExposeHeader
:
[]
string
{},
AllowedHeader
:
[]
string
{
"*"
},
MaxAgeSeconds
:
3600
,
},
})
}
// InitOSSClient 初始化OSS鉴权客户端
func
(
handler
*
Driver
)
InitOSSClient
()
error
{
if
handler
.
Policy
==
nil
{
...
...
@@ -238,27 +262,6 @@ func (handler Driver) Source(
}
func
(
handler
Driver
)
signSourceURL
(
ctx
context
.
Context
,
path
string
,
ttl
int64
,
options
[]
oss
.
Option
)
(
string
,
error
)
{
cdnURL
,
err
:=
url
.
Parse
(
handler
.
Policy
.
BaseURL
)
if
err
!=
nil
{
return
""
,
err
}
// 公有空间不需要签名
if
!
handler
.
Policy
.
IsPrivate
{
file
,
err
:=
url
.
Parse
(
path
)
if
err
!=
nil
{
return
""
,
err
}
sourceURL
:=
cdnURL
.
ResolveReference
(
file
)
// 如果有缩略图设置
if
thumbSize
,
ok
:=
ctx
.
Value
(
fsctx
.
ThumbSizeCtx
)
.
(
string
);
ok
{
sourceURL
.
RawQuery
=
"x-oss-process="
+
thumbSize
}
return
sourceURL
.
String
(),
nil
}
signedURL
,
err
:=
handler
.
bucket
.
SignURL
(
path
,
oss
.
HTTPGet
,
ttl
,
options
...
)
if
err
!=
nil
{
return
""
,
err
...
...
@@ -269,8 +272,26 @@ func (handler Driver) signSourceURL(ctx context.Context, path string, ttl int64,
if
err
!=
nil
{
return
""
,
err
}
finalURL
.
Host
=
cdnURL
.
Host
finalURL
.
Scheme
=
cdnURL
.
Scheme
// 优先使用https
finalURL
.
Scheme
=
"https"
// 公有空间替换掉Key
if
!
handler
.
Policy
.
IsPrivate
{
query
:=
finalURL
.
Query
()
query
.
Del
(
"OSSAccessKeyId"
)
query
.
Del
(
"Signature"
)
finalURL
.
RawQuery
=
query
.
Encode
()
}
if
handler
.
Policy
.
BaseURL
!=
""
{
cdnURL
,
err
:=
url
.
Parse
(
handler
.
Policy
.
BaseURL
)
if
err
!=
nil
{
return
""
,
err
}
finalURL
.
Host
=
cdnURL
.
Host
finalURL
.
Scheme
=
cdnURL
.
Scheme
}
return
finalURL
.
String
(),
nil
}
...
...
@@ -301,10 +322,14 @@ func (handler Driver) Token(ctx context.Context, TTL int64, key string) (seriali
Conditions
:
[]
interface
{}{
map
[
string
]
string
{
"bucket"
:
handler
.
Policy
.
BucketName
},
[]
string
{
"starts-with"
,
"$key"
,
path
.
Dir
(
savePath
)},
[]
interface
{}{
"content-length-range"
,
0
,
handler
.
Policy
.
MaxSize
},
},
}
if
handler
.
Policy
.
MaxSize
>
0
{
postPolicy
.
Conditions
=
append
(
postPolicy
.
Conditions
,
[]
interface
{}{
"content-length-range"
,
0
,
handler
.
Policy
.
MaxSize
})
}
return
handler
.
getUploadCredential
(
ctx
,
postPolicy
,
callbackPolicy
,
TTL
)
}
...
...
pkg/filesystem/upload.go
浏览文件 @
c4eada27
...
...
@@ -154,7 +154,7 @@ func (fs *FileSystem) GetUploadToken(ctx context.Context, path string, size uint
// 是否需要预先生成存储路径
var
savePath
string
if
fs
.
User
.
Policy
.
IsPathGenerateNeeded
()
{
savePath
=
fs
.
GenerateSavePath
(
ctx
,
local
.
FileStream
{
Name
:
name
})
savePath
=
fs
.
GenerateSavePath
(
ctx
,
local
.
FileStream
{
Name
:
name
,
VirtualPath
:
path
})
ctx
=
context
.
WithValue
(
ctx
,
fsctx
.
SavePathCtx
,
savePath
)
}
ctx
=
context
.
WithValue
(
ctx
,
fsctx
.
FileSizeCtx
,
size
)
...
...
routers/controllers/admin.go
浏览文件 @
c4eada27
...
...
@@ -172,3 +172,14 @@ func AdminAddPolicy(c *gin.Context) {
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
// AdminAddCORS 创建跨域策略
func
AdminAddCORS
(
c
*
gin
.
Context
)
{
var
service
admin
.
PolicyService
if
err
:=
c
.
ShouldBindJSON
(
&
service
);
err
==
nil
{
res
:=
service
.
AddCORS
()
c
.
JSON
(
200
,
res
)
}
else
{
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
routers/router.go
浏览文件 @
c4eada27
...
...
@@ -334,6 +334,8 @@ func InitMasterRouter() *gin.Engine {
policy
.
POST
(
"test/slave"
,
controllers
.
AdminTestSlave
)
// 创建存储策略
policy
.
POST
(
""
,
controllers
.
AdminAddPolicy
)
// 创建存储策略
policy
.
POST
(
"cors"
,
controllers
.
AdminAddCORS
)
}
}
...
...
service/admin/policy.go
浏览文件 @
c4eada27
...
...
@@ -7,6 +7,7 @@ import (
model
"github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/auth"
"github.com/HFO4/cloudreve/pkg/conf"
"github.com/HFO4/cloudreve/pkg/filesystem/driver/oss"
"github.com/HFO4/cloudreve/pkg/request"
"github.com/HFO4/cloudreve/pkg/serializer"
"github.com/HFO4/cloudreve/pkg/util"
...
...
@@ -37,6 +38,34 @@ type AddPolicyService struct {
Policy
model
.
Policy
`json:"policy" binding:"required"`
}
// PolicyService 存储策略ID服务
type
PolicyService
struct
{
ID
uint
`json:"id" binding:"required"`
}
// AddCORS 创建跨域策略
func
(
service
*
PolicyService
)
AddCORS
()
serializer
.
Response
{
policy
,
err
:=
model
.
GetPolicyByID
(
service
.
ID
)
if
err
!=
nil
{
return
serializer
.
Err
(
serializer
.
CodeNotFound
,
"存储策略不存在"
,
nil
)
}
switch
policy
.
Type
{
case
"oss"
:
handler
:=
oss
.
Driver
{
Policy
:
&
policy
,
HTTPClient
:
request
.
HTTPClient
{},
}
if
err
:=
handler
.
CORS
();
err
!=
nil
{
return
serializer
.
Err
(
serializer
.
CodeInternalSetting
,
"跨域策略添加失败"
,
err
)
}
default
:
return
serializer
.
ParamErr
(
"不支持此策略"
,
nil
)
}
return
serializer
.
Response
{}
}
// Test 从机响应ping
func
(
service
*
SlavePingService
)
Test
()
serializer
.
Response
{
master
,
err
:=
url
.
Parse
(
service
.
Callback
)
...
...
@@ -107,7 +136,7 @@ func (service *AddPolicyService) Add() serializer.Response {
if
err
:=
model
.
DB
.
Create
(
&
service
.
Policy
)
.
Error
;
err
!=
nil
{
return
serializer
.
ParamErr
(
"存储策略添加失败"
,
err
)
}
return
serializer
.
Response
{}
return
serializer
.
Response
{
Data
:
service
.
Policy
.
ID
}
}
// Test 测试本地路径
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录