github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/uptoken/putpolicy.go (about) 1 package uptoken 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "strings" 8 "time" 9 ) 10 11 // PutPolicy 存储上传策略 12 type PutPolicy map[string]interface{} 13 14 const ( 15 putPolicyKeyScope = "scope" 16 putPolicyKeyDeadline = "deadline" 17 putPolicyKeyIsPrefixalScope = "isPrefixalScope" 18 putPolicyKeyInsertOnly = "insertOnly" 19 putPolicyKeyEndUser = "endUser" 20 putPolicyKeyReturnUrl = "returnUrl" 21 putPolicyKeyReturnBody = "returnBody" 22 putPolicyKeyCallbackUrl = "callbackUrl" 23 putPolicyKeyCallbackHost = "callbackHost" 24 putPolicyKeyCallbackBody = "callbackBody" 25 putPolicyKeyCallbackBodyType = "callbackBodyType" 26 putPolicyKeyPersistentOps = "persistentOps" 27 putPolicyKeyPersistentNotifyUrl = "persistentNotifyUrl" 28 putPolicyKeyPersistentPipeline = "persistentPipeline" 29 putPolicyKeyPersistentType = "persistentType" 30 putPolicyKeyPersistentWorkflowTemplateID = "persistentWorkflowTemplateID" 31 putPolicyKeyForceSaveKey = "forceSaveKey" 32 putPolicyKeySaveKey = "saveKey" 33 putPolicyKeyFsizeMin = "fsizeMin" 34 putPolicyKeyFsizeLimit = "fsizeLimit" 35 putPolicyKeyDetectMime = "detectMime" 36 putPolicyKeyMimeLimit = "mimeLimit" 37 putPolicyKeyFileType = "fileType" 38 ) 39 40 var ( 41 // ErrEmptyBucketName 空的 Bucket 名称 42 ErrEmptyBucketName = errors.New("empty bucket name") 43 44 // ErrInvalidPolicyValue 非法凭证值 45 ErrInvalidPolicyValue = errors.New("invalid put policy value") 46 ) 47 48 // FieldError indicates an error condition occurred while setting put policy 49 type FieldError struct { 50 Err error 51 } 52 53 func (e *FieldError) Error() string { 54 return fmt.Sprintf("failed to set put policy: %v", e.Err) 55 } 56 57 // Unwrap returns the underlying error cause 58 func (e *FieldError) Unwrap() error { 59 return e.Err 60 } 61 62 // NewPutPolicy 为指定的空间生成上传策略 63 func NewPutPolicy(bucket string, expiry time.Time) (PutPolicy, error) { 64 return NewPutPolicyWithKey(bucket, "", expiry) 65 } 66 67 // NewPutPolicyWithKey 为指定的空间和对象名称生成上传策略 68 func NewPutPolicyWithKey(bucket, key string, expiry time.Time) (PutPolicy, error) { 69 if bucket == "" { 70 return nil, &FieldError{Err: ErrEmptyBucketName} 71 } 72 scope := bucket 73 if key != "" { 74 scope += ":" + key 75 } 76 return make(PutPolicy).SetScope(scope).SetDeadline(expiry.Unix()), nil 77 } 78 79 // NewPutPolicyWithKeyPrefix 为指定的空间和对象前缀生成上传策略 80 func NewPutPolicyWithKeyPrefix(bucket, keyPrefix string, expiry time.Time) (PutPolicy, error) { 81 putPolicy, err := NewPutPolicyWithKey(bucket, keyPrefix, expiry) 82 if err != nil { 83 return nil, err 84 } 85 return putPolicy.SetIsPrefixalScope(1), nil 86 } 87 88 // GetScope 获取指定的上传的目标资源空间 Bucket 和资源键 Key 89 func (putPolicy PutPolicy) GetScope() (string, bool) { 90 return putPolicy.getString(putPolicyKeyScope) 91 } 92 93 // SetScope 指定上传的目标资源空间 Bucket 和资源键 Key 94 func (putPolicy PutPolicy) SetScope(value string) PutPolicy { 95 _ = putPolicy.Set(putPolicyKeyScope, value) 96 return putPolicy 97 } 98 99 // GetDeadline 获取上传策略有效截止时间 100 func (putPolicy PutPolicy) GetDeadline() (int64, bool) { 101 return putPolicy.getInt64(putPolicyKeyDeadline) 102 } 103 104 // SetDeadline 指定上传策略有效截止时间 105 func (putPolicy PutPolicy) SetDeadline(value int64) PutPolicy { 106 _ = putPolicy.Set(putPolicyKeyDeadline, value) 107 return putPolicy 108 } 109 110 // GetIsPrefixalScope 获取是否允许用户上传以 scope 的 keyPrefix 为前缀的文件 111 func (putPolicy PutPolicy) GetIsPrefixalScope() (int64, bool) { 112 return putPolicy.getInt64(putPolicyKeyIsPrefixalScope) 113 } 114 115 // SetIsPrefixalScope 指定是否允许用户上传以 scope 的 keyPrefix 为前缀的文件 116 func (putPolicy PutPolicy) SetIsPrefixalScope(value int64) PutPolicy { 117 _ = putPolicy.Set(putPolicyKeyIsPrefixalScope, value) 118 return putPolicy 119 } 120 121 // GetInsertOnly 获取是否限定为新增语意 122 func (putPolicy PutPolicy) GetInsertOnly() (int64, bool) { 123 return putPolicy.getInt64(putPolicyKeyInsertOnly) 124 } 125 126 // SetInsertOnly 指定是否限定为新增语意 127 func (putPolicy PutPolicy) SetInsertOnly(value int64) PutPolicy { 128 _ = putPolicy.Set(putPolicyKeyInsertOnly, value) 129 return putPolicy 130 } 131 132 // GetEndUser 获取唯一属主标识 133 func (putPolicy PutPolicy) GetEndUser() (string, bool) { 134 return putPolicy.getString(putPolicyKeyEndUser) 135 } 136 137 // SetEndUser 指定唯一属主标识 138 func (putPolicy PutPolicy) SetEndUser(value string) PutPolicy { 139 _ = putPolicy.Set(putPolicyKeyEndUser, value) 140 return putPolicy 141 } 142 143 // GetReturnUrl 获取 Web 端文件上传成功后,浏览器执行 303 跳转的 URL 144 func (putPolicy PutPolicy) GetReturnUrl() (string, bool) { 145 return putPolicy.getString(putPolicyKeyReturnUrl) 146 } 147 148 // SetReturnUrl 指定 Web 端文件上传成功后,浏览器执行 303 跳转的 URL 149 func (putPolicy PutPolicy) SetReturnUrl(value string) PutPolicy { 150 _ = putPolicy.Set(putPolicyKeyReturnUrl, value) 151 return putPolicy 152 } 153 154 // GetReturnBody 获取上传成功后,自定义七牛云最终返回给上传端的数据 155 func (putPolicy PutPolicy) GetReturnBody() (string, bool) { 156 return putPolicy.getString(putPolicyKeyReturnBody) 157 } 158 159 // SetReturnBody 指定上传成功后,自定义七牛云最终返回给上传端的数据 160 func (putPolicy PutPolicy) SetReturnBody(value string) PutPolicy { 161 _ = putPolicy.Set(putPolicyKeyReturnBody, value) 162 return putPolicy 163 } 164 165 // GetCallbackUrl 获取上传成功后,七牛云向业务服务器发送 POST 请求的 URL 166 func (putPolicy PutPolicy) GetCallbackUrl() (string, bool) { 167 return putPolicy.getString(putPolicyKeyCallbackUrl) 168 } 169 170 // SetCallbackUrl 指定上传成功后,七牛云向业务服务器发送 POST 请求的 URL 171 func (putPolicy PutPolicy) SetCallbackUrl(value string) PutPolicy { 172 _ = putPolicy.Set(putPolicyKeyCallbackUrl, value) 173 return putPolicy 174 } 175 176 // GetCallbackHost 获取上传成功后,七牛云向业务服务器发送回调通知时的 Host 值 177 func (putPolicy PutPolicy) GetCallbackHost() (string, bool) { 178 return putPolicy.getString(putPolicyKeyCallbackHost) 179 } 180 181 // SetCallbackHost 指定上传成功后,七牛云向业务服务器发送回调通知时的 Host 值 182 func (putPolicy PutPolicy) SetCallbackHost(value string) PutPolicy { 183 _ = putPolicy.Set(putPolicyKeyCallbackHost, value) 184 return putPolicy 185 } 186 187 // GetCallbackBody 获取上传成功后,七牛云向业务服务器发送 Content-Type: application/x-www-form-urlencoded 的 POST 请求 188 func (putPolicy PutPolicy) GetCallbackBody() (string, bool) { 189 return putPolicy.getString(putPolicyKeyCallbackBody) 190 } 191 192 // SetCallbackBody 指定上传成功后,七牛云向业务服务器发送 Content-Type: application/x-www-form-urlencoded 的 POST 请求 193 func (putPolicy PutPolicy) SetCallbackBody(value string) PutPolicy { 194 _ = putPolicy.Set(putPolicyKeyCallbackBody, value) 195 return putPolicy 196 } 197 198 // GetCallbackBodyType 获取上传成功后,七牛云向业务服务器发送回调通知 callbackBody 的 Content-Type 199 func (putPolicy PutPolicy) GetCallbackBodyType() (string, bool) { 200 return putPolicy.getString(putPolicyKeyCallbackBodyType) 201 } 202 203 // SetCallbackBodyType 指定上传成功后,七牛云向业务服务器发送回调通知 callbackBody 的 Content-Type 204 func (putPolicy PutPolicy) SetCallbackBodyType(value string) PutPolicy { 205 _ = putPolicy.Set(putPolicyKeyCallbackBodyType, value) 206 return putPolicy 207 } 208 209 // GetPersistentOps 获取资源上传成功后触发执行的预转持久化处理指令列表 210 func (putPolicy PutPolicy) GetPersistentOps() (string, bool) { 211 return putPolicy.getString(putPolicyKeyPersistentOps) 212 } 213 214 // SetPersistentOps 指定资源上传成功后触发执行的预转持久化处理指令列表 215 func (putPolicy PutPolicy) SetPersistentOps(value string) PutPolicy { 216 _ = putPolicy.Set(putPolicyKeyPersistentOps, value) 217 return putPolicy 218 } 219 220 // GetPersistentNotifyUrl 获取接收持久化处理结果通知的 URL 221 func (putPolicy PutPolicy) GetPersistentNotifyUrl() (string, bool) { 222 return putPolicy.getString(putPolicyKeyPersistentNotifyUrl) 223 } 224 225 // SetPersistentNotifyUrl 指定接收持久化处理结果通知的 URL 226 func (putPolicy PutPolicy) SetPersistentNotifyUrl(value string) PutPolicy { 227 _ = putPolicy.Set(putPolicyKeyPersistentNotifyUrl, value) 228 return putPolicy 229 } 230 231 // GetPersistentPipeline 获取转码队列名 232 func (putPolicy PutPolicy) GetPersistentPipeline() (string, bool) { 233 return putPolicy.getString(putPolicyKeyPersistentPipeline) 234 } 235 236 // SetPersistentPipeline 指定转码队列名 237 func (putPolicy PutPolicy) SetPersistentPipeline(value string) PutPolicy { 238 _ = putPolicy.Set(putPolicyKeyPersistentPipeline, value) 239 return putPolicy 240 } 241 242 // GetPersistentType 获取任务类型 243 func (putPolicy PutPolicy) GetPersistentType() (int64, bool) { 244 return putPolicy.getInt64(putPolicyKeyPersistentType) 245 } 246 247 // SetPersistentType 指定任务类型 248 func (putPolicy PutPolicy) SetPersistentType(value int64) PutPolicy { 249 _ = putPolicy.Set(putPolicyKeyPersistentType, value) 250 return putPolicy 251 } 252 253 // GetPersistentWorkflowTemplateID 获取工作流模版 ID 254 func (putPolicy PutPolicy) GetPersistentWorkflowTemplateID() (string, bool) { 255 return putPolicy.getString(putPolicyKeyPersistentWorkflowTemplateID) 256 } 257 258 // SetPersistentWorkflowTemplateID 指定工作流模版 ID 259 func (putPolicy PutPolicy) SetPersistentWorkflowTemplateID(value string) PutPolicy { 260 _ = putPolicy.Set(putPolicyKeyPersistentWorkflowTemplateID, value) 261 return putPolicy 262 } 263 264 // GetForceSaveKey 获取 saveKey 的优先级设置 265 func (putPolicy PutPolicy) GetForceSaveKey() (bool, bool) { 266 return putPolicy.getBool(putPolicyKeyForceSaveKey) 267 } 268 269 // SetForceSaveKey 指定 saveKey 的优先级设置 270 func (putPolicy PutPolicy) SetForceSaveKey(value bool) PutPolicy { 271 _ = putPolicy.Set(putPolicyKeyForceSaveKey, value) 272 return putPolicy 273 } 274 275 // GetSaveKey 获取自定义资源名 276 func (putPolicy PutPolicy) GetSaveKey() (string, bool) { 277 return putPolicy.getString(putPolicyKeySaveKey) 278 } 279 280 // SetSaveKey 指定自定义资源名 281 func (putPolicy PutPolicy) SetSaveKey(value string) PutPolicy { 282 _ = putPolicy.Set(putPolicyKeySaveKey, value) 283 return putPolicy 284 } 285 286 // GetFsizeMin 获取限定上传文件大小最小值 287 func (putPolicy PutPolicy) GetFsizeMin() (int64, bool) { 288 return putPolicy.getInt64(putPolicyKeyFsizeMin) 289 } 290 291 // SetFsizeMin 指定限定上传文件大小最小值 292 func (putPolicy PutPolicy) SetFsizeMin(value int64) PutPolicy { 293 _ = putPolicy.Set(putPolicyKeyFsizeMin, value) 294 return putPolicy 295 } 296 297 // GetFsizeLimit 获取限定上传文件大小最大值 298 func (putPolicy PutPolicy) GetFsizeLimit() (int64, bool) { 299 return putPolicy.getInt64(putPolicyKeyFsizeLimit) 300 } 301 302 // SetFsizeLimit 指定限定上传文件大小最大值 303 func (putPolicy PutPolicy) SetFsizeLimit(value int64) PutPolicy { 304 _ = putPolicy.Set(putPolicyKeyFsizeLimit, value) 305 return putPolicy 306 } 307 308 // GetDetectMime 获取开启 MimeType 侦测功能 309 func (putPolicy PutPolicy) GetDetectMime() (int64, bool) { 310 return putPolicy.getInt64(putPolicyKeyDetectMime) 311 } 312 313 // SetDetectMime 指定开启 MimeType 侦测功能 314 func (putPolicy PutPolicy) SetDetectMime(value int64) PutPolicy { 315 _ = putPolicy.Set(putPolicyKeyDetectMime, value) 316 return putPolicy 317 } 318 319 // GetMimeLimit 获取限定用户上传的文件类型 320 func (putPolicy PutPolicy) GetMimeLimit() (string, bool) { 321 return putPolicy.getString(putPolicyKeyMimeLimit) 322 } 323 324 // SetMimeLimit 指定限定用户上传的文件类型 325 func (putPolicy PutPolicy) SetMimeLimit(value string) PutPolicy { 326 _ = putPolicy.Set(putPolicyKeyMimeLimit, value) 327 return putPolicy 328 } 329 330 // GetFileType 获取文件存储类型 331 func (putPolicy PutPolicy) GetFileType() (int64, bool) { 332 return putPolicy.getInt64(putPolicyKeyFileType) 333 } 334 335 // SetFileType 指定文件存储类型 336 func (putPolicy PutPolicy) SetFileType(value int64) PutPolicy { 337 _ = putPolicy.Set(putPolicyKeyFileType, value) 338 return putPolicy 339 } 340 341 // Get 获取上传策略的值 342 func (putPolicy PutPolicy) Get(key string) (value interface{}, ok bool) { 343 value, ok = putPolicy[key] 344 return 345 } 346 347 func (putPolicy PutPolicy) getString(key string) (string, bool) { 348 v, ok := putPolicy[key] 349 if !ok { 350 return "", false 351 } 352 s, ok := v.(string) 353 return s, ok 354 } 355 356 func (putPolicy PutPolicy) getBool(key string) (bool, bool) { 357 v, ok := putPolicy[key] 358 if !ok { 359 return false, false 360 } 361 b, ok := v.(bool) 362 return b, ok 363 } 364 365 func (putPolicy PutPolicy) getInt64(key string) (int64, bool) { 366 if v, ok := putPolicy[key]; ok { 367 switch i := v.(type) { 368 case int64: 369 return i, true 370 case float64: 371 return int64(i), true 372 case float32: 373 return int64(i), true 374 case int32: 375 return int64(i), true 376 case int16: 377 return int64(i), true 378 case int8: 379 return int64(i), true 380 case int: 381 return int64(i), true 382 case uint64: 383 return int64(i), true 384 case uint32: 385 return int64(i), true 386 case uint16: 387 return int64(i), true 388 case uint8: 389 return int64(i), true 390 case uint: 391 return int64(i), true 392 case json.Number: 393 i64, err := i.Int64() 394 return i64, err == nil 395 } 396 } 397 return 0, false 398 } 399 400 // Set 设置上传策略的值 401 // 402 // 如果 value 为 nil,则返回 ErrInvalidPolicyValue 错误。 403 func (putPolicy PutPolicy) Set(key string, value interface{}) error { 404 if value == nil { 405 return &FieldError{Err: ErrInvalidPolicyValue} 406 } 407 putPolicy[key] = value 408 return nil 409 } 410 411 // Delete 删除上传策略的值 412 func (putPolicy PutPolicy) Delete(key string) (value interface{}, ok bool) { 413 value, ok = putPolicy[key] 414 delete(putPolicy, key) 415 return 416 } 417 418 // GetBucketName 获取上传策略内的空间名称 419 // 420 // 该方法会从上传策略中解析出空间名称,如果上传策略中没有 scope 字段,则返回 ErrEmptyBucketName 错误,如果上传策略的 scope 字段格式有误,则返回 ErrInvalidPolicyValue 错误。 421 func (putPolicy PutPolicy) GetBucketName() (string, error) { 422 if scope, ok := putPolicy.GetScope(); !ok { 423 return "", ErrInvalidPolicyValue 424 } else { 425 fields := strings.SplitN(scope, ":", 2) 426 if len(fields) == 0 { 427 return "", ErrEmptyBucketName 428 } 429 return fields[0], nil 430 } 431 }