docs: @Override
  	public Map<String, Object> createUploadToken(UploadTokenParam param) {
  		
  		Map<String, Object> result = new HashMap<>();
  		
  		PolicyConditions policyConds = new PolicyConditions();
  		if(param.getFsizeMin() != null && param.getFsizeMax() != null){			
  			policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, param.getFsizeMin(), param.getFsizeMax());
  		}else{
  			policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
  		}
  		if(param.getUploadDir() != null){			
  			policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, param.getUploadDir());
  		}
          
  		if(StringUtils.isBlank(param.getCallbackHost())){
  			param.setCallbackHost(host);
  		}
  		
  		if(StringUtils.isBlank(param.getCallbackBody())){
  			param.setCallbackBody(DEFAULT_CALLBACK_BODY);
  		}
  		
  		Date expire = DateUtils.addSeconds(new Date(), (int)param.getExpires());
  		String policy = ossClient.generatePostPolicy(expire, policyConds);
          String policyBase64 = null;
          String callbackBase64 = null;
          try {
          	policyBase64 = BinaryUtil.toBase64String(policy.getBytes(StandardCharsets.UTF_8.name()));
          	String callbackJson = param.getCallbackRuleAsJson();
          	if(callbackJson != null){
          		callbackBase64 = BinaryUtil.toBase64String(callbackJson.getBytes(StandardCharsets.UTF_8.name()));
          	}
  		} catch (Exception e) {
  			throw new RuntimeException(e);
  		}
  		String signature = ossClient.calculatePostSignature(policy);
  		
  		result.put("OSSAccessKeyId", accessKeyId);
  		result.put("policy", policyBase64);
  		result.put("signature", signature);
  		result.put("host", this.urlprefix);
  		result.put("dir", param.getUploadDir());
  		result.put("expire", String.valueOf(expire.getTime()));
  		if(callbackBase64 != null){
  			result.put("callback", callbackBase64);
  		}
  		return result;
  	}