云服务器内容精选

  • 代码示例 本示例展示了如何通过使用断点续传方式将本地文件localfile上传到examplebucket桶下的objectKey对象中。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.CompleteMultipartUploadResult; import com.obs.services.model.UploadFileRequest; public class UploadFile001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { UploadFileRequest request = new UploadFileRequest("examplebucket", "objectKey"); // 设置待上传的本地文件,localfile为待上传的本地文件路径,需要指定到具体带文件后缀的文件名 request.setUploadFile("localfile"); // 设置分段上传时的最大并发数 request.setTaskNum(5); // 设置分段大小为10MB request.setPartSize(10 * 1024 * 1024); // 开启断点续传模式 request.setEnableCheckpoint(true); // 进行断点续传上传 CompleteMultipartUploadResult result = obsClient.uploadFile(request); System.out.println("UploadFile successfully"); } catch (ObsException e) { // 发生异常时可再次调用断点续传上传接口进行重新上传 System.out.println("UploadFile failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("UploadFile failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 功能说明 对分段上传的封装和加强,解决上传大文件时由于网络不稳定或程序崩溃导致上传失败的问题。其原理是将待上传的文件分成若干个分段分别上传,并实时地将每段上传结果统一记录在checkpoint文件中,仅当所有分段都上传成功时返回上传成功的结果,否则返回错误信息提醒用户再次调用接口进行重新上传(重新上传时因为有checkpoint文件记录当前的上传进度,避免重新上传所有分段,从而节省资源提高效率)。
  • 接口约束 您必须是桶拥有者或拥有上传对象的权限,才能上传对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 断点续传上传接口传入的文件大小至少要100K以上。 使用SDK的断点续传接口时,必须开启断点续传选项后才能在进程再次进入时读取上一次上传的进度。
  • 代码示例 本示例用于对examplebucket桶中的objectname对象做多段上传初始化,并获取uploadId。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.InitiateMultipartUploadRequest; import com.obs.services.model.InitiateMultipartUploadResult; import com.obs.services.model.ObjectMetadata; public class InitiateMultipartUpload001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest("examplebucket", "objectname"); ObjectMetadata metadata = new ObjectMetadata(); metadata.addUserMetadata("property", "property-value"); metadata.setContentType("text/plain"); request.setMetadata(metadata); InitiateMultipartUploadResult result = obsClient.initiateMultipartUpload(request); String uploadId = result.getUploadId(); System.out.println("initiateMultipartUpload successfully"); System.out.println("uploadId:" + uploadId); } catch (ObsException e) { System.out.println("initiateMultipartUpload failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("initiateMultipartUpload failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 接口约束 您必须是桶拥有者或拥有初始化分段上传任务的权限,才能初始化分段上传任务。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 初始化上传段任务并上传一个或多个段之后,您必须合并段或取消多段上传任务,否则碎片会占用您的存储空间并产生一定的存储费用。
  • 响应参数 状态码: 200 表7 响应Body参数 参数 参数类型 描述 asset_id String 媒体ID video_upload_url String 视频上传URL cover_upload_url String 封面上传地址 subtitle_upload_urls Array of strings 字幕文件上传url数组 target File_addr object 媒资存储参数信息。查询接口,仅媒资为托管时有返回值。 表8 File_addr 参数 参数类型 描述 bucket String OBS的bucket名称。 location String 桶所在的区域名, 如“华北-北京四”的区域名为“cn-north-4”,创建的桶所在区域必须和点播服务所在区域保持一致。 object String 文件的存储路径。 状态码: 403 表9 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误描述。
  • 响应示例 状态码: 200 处理成功返回。 { "asset_id" : "f488337c31c8e4622f1590735b134c65", "video_upload_url" : "https://obs.cn-north-4.myhuaweicloud.com:443/obs-vod-1/%7Bproject_id%7D/f488337c31c8e4622f1590735b134c65/Avatar_480P.mp4?AWSAccessKeyId=CBN2JOVSQVVUREU0RCSN&Expires=1518147618&Signature=kZYh0hEos2VJhjjdHC2zVAHGyXA%3D", "cover_upload_url" : "https://obs.cn-north-4.myhuaweicloud.com:443/obs-vod-1/%7Bproject_id%7D/f488337c31c8e4622f1590735b134c65/cover/Cover0.jpg?AWSAccessKeyId=CBN2JOVSQVVUREU0RCSN&Expires=1518147619&Signature=eVoLA54Qi6cG9vZbS3fuaIw1RDQ%3D", "subtitle_upload_urls" : [ "https://obs-vod-1.obs.cn-north-4.myhuaweicloud.com:443/14ce1d4437164aba8b364ce15866154e/53a018d2dc53ca07eb5a07a839205c9d/subtitle/1.srt?AWSAccessKeyId=CBN2JOVSQVVUREU0RCSN&Expires=1534760131&Signature=twZPabMSf%2FO%2B2H3mpo3Gsqk1uIo%3D" ], "target" : { "bucket" : "obs-vod-1", "location" : "cn-north-4", "object" : "093bb6b6c4fc460ab90a40d8b821dda3/a2053aef99725711dad3e02dc6cd5f89/0a9b70035b78b8a19c6d9e7c2693d93c.mp4" } } 状态码: 403 处理失败返回。 { "error_code" : "VOD.10064", "error_msg" : "Media asset classification does not exist, please check." }
  • 请求示例 创建媒资 POST https://{endpoint}/v1/{project_id}/asset Content-Type: application/json { "title": "Avatar test test", "description": "Avatar, test", "category_id": -1, "tags": "mytags", "video_name": "Avatar_480P.mp4", "video_type": "MP4", "video_md5": "a945d4b3d8fc317190a9332fe856f03d", "cover_type": "JPG", "cover_md5": "a655d4b3d8fc758691a9332fe387f26c", "auto_publish": 0, "subtitles": [ { "id": 1, "language": "CN", "type": "SRT", "md5": "SqcyFjJZoDZaP8oKIY6rgQ==", "description": "AAAAA" } ] }
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 否 String 用户Token,使用Token鉴权方式时必选。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 Authorization 否 String 使用AK/SK方式认证时必选,携带的鉴权信息。 X-Sdk-Date 否 String 使用AK/SK方式认证时必选,请求的发生时间。 表3 请求Body参数 参数 是否必选 参数类型 描述 title 是 String 媒资标题,长度不超过128个字节,UTF-8编码。 description 否 String 视频描述,长度不超过1024个字节。 video_name 是 String 音视频文件名,长度不超过128个字节。 文件名后缀可选。 video_type 是 String 上传音视频文件的格式。 取值如下: 视频文件:MP4、TS、MOV、MXF、MPG、FLV、WMV、AVI、M4V、F4V、MPEG、3GP、ASF、MKV 音频文件:MP3、OGG、WAV、WMA、APE、FLAC、AAC、AC3、MMF、AMR、M4A、M4R、WV、MP2 若上传格式为音频文件,则不支持转码、添加水印和字幕。 category_id 否 Integer 媒资分类ID。 您可以调用创建媒资分类接口或在点播控制台的分类设置中创建对应的媒资分类,并获取分类ID。 说明: 若不设置或者设置为-1,则上传的音视频归类到系统预置的“其它”分类中。 video_md5 否 String 建议参考《API参考》附录下生成MD5值的媒资上传和更新示例。 cover_type 否 String 封面图片文件类型。 取值如下: JPG PNG 上传后的封面名称是固定的,后缀名为封面类型缩写。例如cover0.jpg,cover1.png 若不指定类型,则封面文件无后缀名。 说明: 如果设置了图片格式,则不会执行首帧截图作为封面动作,需自行上传封面。 cover_md5 否 String 封面图片文件MD5值。建议参考《API参考》附录下生成MD5值的媒资上传和更新示例。 subtitles 否 Array of Subtitle objects 字幕文件信息 tags 否 String 视频标签。 单个标签不超过16个字节,最多不超过16个标签。 多个用逗号分隔,UTF8编码。 auto_publish 否 Integer 是否自动发布。 取值如下: 0:表示不自动发布。 1:表示自动发布。 默认值:1。 template_group_name 否 String 转码模板组名称。 若不为空,则使用指定的转码模板对上传的音视频进行转码,您可以在视频点播控制台配置转码模板,具体请参见《点播服务用户指南》中的“转码设置”。 说明: 若同时设置了“template_group_name”和“workflow_name”字段,则“template_group_name”字段生效。 auto_encrypt 否 Integer 是否自动加密。 取值如下: 0:表示不加密。 1:表示需要加密。 默认值:0。 加密与转码必须要一起进行,当需要加密时,转码参数不能为空,且转码输出格式必须要为HLS。 auto_preheat 否 String 是否自动预热到CDN。 取值如下: 0:表示不自动预热。 1:表示自动预热。 默认值:0。 thumbnail 否 Thumbnail object 截图参数 review 否 Review object 媒资审核参数。 说明: 仅“华北-北京一”、“华北-北京四”点播服务支持此功能。 workflow_name 否 String 工作流名称。若不为空,则使用指定的工作流对上传的音视频进行处理,您可以在视频点播控制台配置工作流,具体请参见《点播服务用户指南》中的“工作流设置”。 表4 Subtitle 参数 是否必选 参数类型 描述 id 是 Integer 字幕id。 取值范围:[1,16]。 type 是 String 字幕文件类型,目前暂只支持“SRT”和“VTT”。 language 是 String 字幕语言类型。 name 否 String 字幕文件名称。 md5 否 String 字幕文件的MD5值。 description 否 String 字幕描述。 表5 Thumbnail 参数 是否必选 参数类型 描述 type 是 String 截图类型。 取值如下: time:每次进行截图的间隔时间。 dots: 按照指定的时间点截图。 quantity: 按照指定张数,根据视频时长等分视频截图。 quantity 否 Integer type取值为quantity时必填。 按照指定张数,根据视频时长等分视频截图。 取值范围:[1,10]之间的整数。 quantity_time 否 Integer type取值为quantity时选填。 按照指定时间间隔取指定张数截图。 取值范围:[0,2147483647]之间的整数。 time 否 Integer 根据时间间隔采样时的时间间隔值。单位:秒。 type取值为time时。 默认值:12 取值范围:[0,100]之间的整数。 dots 否 Array of integers type取值为dots时必填。指定时间截图时的时间点数组。 cover_position 否 Integer 该值表示指定第几张截图作为封面。 默认值:1。 format 否 Integer 截图文件格式。 取值如下: 1:jpg。 默认值:1 。 aspect_ratio 否 Integer 纵横比,图像缩放方式。 取值如下: 0:自适应(保持原有宽高比)。 1:16:9。 默认值:0。 max_length 否 Integer 截图最长边的尺寸。 单位:像素。 宽边尺寸按照该尺寸与原始视频像素等比缩放计算。 默认值:480。 表6 Review 参数 是否必选 参数类型 描述 template_id 是 String 审核模板ID。您可以在视频点播控制台配置审核模板后获取,具体请参见《点播服务用户指南》中的“审核设置”。 说明: 仅“华北-北京一”、“华北-北京四”点播服务支持此功能。 interval 否 Integer 截图检测时间间隔,取值范围为[0,100],该参数在请求参数中忽略。 politics 否 Integer 鉴政内容检测置信度,取值范围为[0,100],该参数在请求参数中忽略。 置信度越高,说明审核结果越可信。未开启或设置为0时,表示未进行此项检测。 terrorism 否 Integer 鉴恐内容的检测置信度,取值范围为[0,100],该参数在请求参数中忽略。 置信度越高,说明审核结果越可信。未开启或设置为0时,表示未进行此项检测。 porn 否 Integer 鉴黄内容的检测置信度,取值范围为[0,100],该参数在请求参数中忽略。 置信度越高,说明审核结果越可信。未开启或设置为0时,表示未进行此项检测。
  • 数据上传方式 城市智能体云平台提供数据文件上传功能,用户可以将本地的数据上传至系统默认提供的存储空间中。 当前平台支持三种数据上传方式: 桌面端程序OBS Browser+。 命令行工具obsutil。 数据快递。 OBS Browser+对网络要求较高,上传过程中需要尽量减少网络波动,否则容易导致数据上传失败。当上传数据量超过500GB时,建议使用obsutil。如果数据量巨大且对时效性要求较高、能够接受额外的服务成本,建议使用数据快递进行数据上传。 具体使用哪个数据上传方式请参考表1。 表1 数据上传场景 上传数据方式 业务场景 优势 劣势 推荐 OBS Browser+ 主要适用于上传数据量小(文件大小小于500GB),且网络较好的场景。 OBS Browser+的图形化界面可以非常方便地让用户在本地对OBS进行管理,例如:创建桶、上传下载文件、浏览文件等。 对网络要求较高且只针对小数据量。 文件大小小于500GB。 obsutil 主要适用于上传数据量较大(文件大小超过500GB),或者需要执行批量处理、自动化任务的场景。 简单、易用; 无需安装,轻便小巧,即下即用; 同时支持Windows/Linux/macOS三大平台; 配置多元化,性能卓越。 需要用户了解命令行操作。 文件大小超过500GB。 数据快递 主要适用于TB到数百TB级数据且对时效性要求较高、能够接受额外的服务成本,使用物理存储介质(Teleport设备、外置USB硬盘驱动器、SATA硬盘驱动器、SAS硬盘驱动器等)上传大量数据的场景。 1.解决海量数据传输的难题(包括高昂网络成本、较长传输时间等)。 2.DES传输数据的速度可达到1000Mbps,相当于高速Internet传输速度的10倍,但是成本却低至高速。Internet费用的五分之一。 3.使用DES不占用用户公网带宽,不与主营业务争抢带宽资源。 1.数据快递方式需要华为数据中心邮寄Teleport设备给用户使用或者用户需自己准备磁盘进行快递的方式。 2.中途会耗费一定的时间。 3.会有额外的服务成本。 4.在快递期间可能存在丢失损坏的风险。 文件大小在TB到数百TB级数据,且能接受额外的服务成本,对数据时效性要求较高。 父主题: 数据上传
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 code Integer 返回码 最小值:1 最大值:50 message String 响应消息 最小长度:1 最大长度:100 data String 上传的文件链接 状态码: 500 表5 响应Body参数 参数 参数类型 描述 error_code String 错误码 最小长度:1 最大长度:100 error_msg String 错误描述 最小长度:1 最大长度:100
  • 追加上传 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 追加上传可实现对同一个对象追加数据内容的功能。您可以通过ObsClient.AppendObject进行追加上传。示例代码如下: // 初始化配置参数 ObsConfig config = new ObsConfig(); config.Endpoint = "https://your-endpoint"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html string accessKey= Environment.GetEnvironmentVariable("AccessKeyID", EnvironmentVariableTarget.Machine); string secretKey= Environment.GetEnvironmentVariable("SecretAccessKey", EnvironmentVariableTarget.Machine); // 创建ObsClient实例 ObsClient client = new ObsClient(accessKey, secretKey, config); try { // 第一次追加上传 AppendObjectRequest request = new AppendObjectRequest(); request.BucketName = "bucketname"; request.ObjectKey = "objectkey"; request.InputStream = new MemoryStream(Encoding.UTF8.GetBytes("Hello OBS")); AppendObjectResponse response = client.AppendObject(request); // 第二次追加上传 request.Position = response.NextPosition; request.InputStream = new MemoryStream(Encoding.UTF8.GetBytes("Hello OBS Again")); response = client.AppendObject(request); Console.WriteLine("NextPosition:{0}", response.NextPosition); Console.WriteLine("ETag:{0}", response.ETag); // 通过获取对象属性接口获取下次追加上传的位置 GetObjectMetadataResponse metadataResponse = client.GetObjectMetadata("bucketname", "objectkey"); Console.WriteLine("NextPosition from metadata:{0}", metadataResponse.NextPosition); } catch (ObsException ex) { Console.WriteLine("ErrorCode: {0}", ex.ErrorCode); Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage); } ObsClient.PutObject上传的对象可覆盖ObsClient.AppendObject上传的对象,覆盖后对象变为普通对象,不可再进行追加上传。 第一次调用追加上传时,如果已存在同名的普通对象,则会抛出异常(HTTP状态码为409)。 每次追加上传返回的ETag是当次追加数据内容的ETag,不是完整对象的ETag。 单次追加上传的内容不能超过5GB,且最多支持10000次追加上传。 追加上传成功后,可通过AppendObjectResponse.NextPosition获取下次追加上传的位置;或者通过ObsClient.GetObjectMetadata接口获取下次追加上传的位置。 父主题: 上传对象
  • 域名证书 若在华为云注册的域名,在域名列表页,单击域名名称,在域名信息页单击“域名证书”即可获取域名证书。具体操作如下: 打开域名列表页。 在域名列表栏,单击待下载域名的名称。 图1 域名列表 在“域名信息”详情页,单击上方栏的“域名证书”。 图2 域名信息 在“域名证书”页面,单击“下载证书”。 浏览器左下角将显示下载的电子版域名证书。 图3 下载证书 下载成功后,在备案信息页面“其他资料”下面单击“管理域名证书”,上传域名证书。 图4 管理域名证书 其他域名注册商注册的,请联系您的域名注册商提供。建议同时核对域名注册信息,确保符合工信部域名核验规则(域名证书只需上传电子版,少数管局要求邮寄纸质域名证书,将另行通知)。 父主题: 上传资料与真实性核验
  • 原因分析 本地挂载目录是在Notebook容器的“~/data”目录下创建的demo-yf文件夹,而JupyterLab左侧导航默认路径为“~/work”目录,相当于/data和/work是同一层级,所以在JupyterLab中看不到。 打开Terminal后,默认为~work目录,执行如下命令进入~data目录查看本地挂载路径: (PyTorch-1.8) [ma-user work]$cd (PyTorch-1.8) [ma-user ~]$cd /data (PyTorch-1.8) [ma-user data]$ls
  • 对象上传简介 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 在OBS中,用户操作的基本数据单元是对象。OBS PHP SDK提供了丰富的对象上传接口,可以通过以下方式上传对象: 文本上传 流式上传 文件上传 分段上传 基于表单上传 SDK支持上传0KB~5GB的对象。流式上传和文件上传的内容大小不能超过5GB;当上传较大文件时,请使用分段上传,分段上传每段内容大小不能超过5GB;基于表单上传提供了基于浏览器表单上传对象的方式。 如果上传的对象权限设置为匿名用户读取权限,对象上传成功后,匿名用户可通过链接地址访问该对象数据。对象链接地址格式为:https://桶名.域名/文件夹目录层级/对象名。如果该对象存在于桶的根目录下,则链接地址将不需要有文件夹目录层级。 父主题: 上传对象