code: public void put(final File file, final String key, String token, final UpCompletionHandler complete,
                      final UploadOptions options) {
          final UpToken decodedToken = UpToken.parse(token);
          if (areInvalidArg(key, null, file, token, decodedToken, complete)) {
              return;
          }
  
          Zone z = config.zone;
          z.preQuery(token, new Zone.QueryHandler() {
              @Override
              public void onSuccess() {
                  long size = file.length();
                  if (size <= config.putThreshold) {
                      FormUploader.upload(client, config, file, key, decodedToken, complete, options);
                      return;
                  }
                  String recorderKey = config.keyGen.gen(key, file);
                  final WarpHandler completionHandler = warpHandler(complete, file != null ? file.length() : 0);
                  ResumeUploader uploader = new ResumeUploader(client, config, file, key,
                          decodedToken, completionHandler, options, recorderKey);
  
                  AsyncRun.runInMain(uploader);
              }
  
              @Override
              public void onFailure(int reason) {
                  final ResponseInfo info = ResponseInfo.isStatusCodeForBrokenNetwork(reason) ?
                          ResponseInfo.networkError(reason, decodedToken) :
                          ResponseInfo.invalidToken("invalid token");
                  complete.complete(key, info, null);
              }
          });
  
      }
docs: 上传文件
  
  @param file     上传的文件对象
  @param key      上传文件保存的文件名
  @param token    上传凭证
  @param complete 上传完成的后续处理动作
  @param options  上传数据的可选参数