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  }