云服务器内容精选

  • 图片处理 开发过程中,您有任何问题可以在github上提交issue,或者在华为云 对象存储服务 论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 OBS为用户提供了稳定、安全、高效、易用、低成本的图片处理服务。当要下载的对象是图片文件时,您可以通过传入图片处理参数对图片文件进行图片剪切、图片缩放、图片水印、格式转换等处理。 更多关于图片处理的内容,参见图片处理特性指南。 以下代码展示了如何使用下载对象接口实现图片处理: // 初始化配置参数 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 { GetObjectRequest request = new GetObjectRequest() { BucketName = "bucketname", ObjectKey = "objectname", // 对图片依次进行缩放、旋转 ImageProcess = "image/resize,m_fixed,w_100,h_100/rotate,90", }; GetObjectResponse response = client.GetObject(request); Console.WriteLine("Get object response: {0}", response.StatusCode); } catch (ObsException ex) { Console.WriteLine("ErrorCode: {0}", ex.ErrorCode); Console.WriteLine("ErrorMessage: {0}", ex.ErrorMessage); } 使用GetObjectRequest.ImageProcess指定图片处理参数。 图片处理参数支持级联处理,可对图片文件依次实施多条命令。 父主题: 下载对象
  • 无法获取上传后的ETag值 使用ObsClient.putObject和ObsClient.uploadPart上传文件成功后返回结果中无ETag值,此类错误一般有两种原因: 桶的CORS配置中ExposeHeader不包含ETag头域,解决方法:按照文档配置桶的CORS为桶配置完整的CORS配置; 桶的CORS配置中ExposeHeader包含ETag头域,但浏览器的返回结果屏蔽了ETag头域(一般发生在低版本的浏览器),解决方法:升级到高版本且完全支持HTML5的浏览器。
  • 跨域请求被拦截 Access to XMLHttpRequest at 'xxx' from origin 'xxx' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  • 请求成功但返回结果缺少某些字段 此类错误一般有两种原因: 在桶的CORS配置中ExposeHeader配置不完整,例如未配置ETag(导致上传对象成功后无法获取ETag值)、未配置x-obs-request-id(导致请求完成后无法获取OBS服务端请求ID)等,解决方法:请参考配置桶的CORS章节重新配置桶的CORS; 使用了旧版本的SDK,解决方法:升级到最新版本的SDK,可以从这里下载最新版本。
  • 透传访问密钥 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 OBS Android SDK提供了直接在接口方法中透传AK和SK的OBS客户端(SecretFlexibleObsClient)。示例代码如下: String endPoint = "https://your-endpoint"; // 创建ObsConfiguration配置类实例 ObsConfiguration config = new ObsConfiguration(); config.setEndPoint(endPoint); // 创建SecretFlexibleObsClient实例 SecretFlexibleObsClient obsClient = new SecretFlexibleObsClient(config); // 使用访问OBS // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AC CES S_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak1 = System.getenv("ACCESS_KEY_ID1"); String sk1 = System.getenv("SECRET_ACCESS_KEY_ID1"); obsClient.listBuckets(ak1, sk1); String ak2 = System.getenv("ACCESS_KEY_ID2"); String sk2 = System.getenv("SECRET_ACCESS_KEY_ID2"); obsClient.listBuckets(ak2, sk2); // 关闭obsClient obsClient.close(); SecretFlexibleObsClient继承自ObsClient,可作为ObsClient使用。 父主题: 初始化
  • 文件上传 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 文件上传使用本地文件作为对象的数据源。以下代码展示了如何进行文件上传: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); try { // 文件上传 // localfile 为待上传的本地文件路径,需要指定到具体的文件名 PutObjectRequest request = new PutObjectRequest(); request.setBucketName("examplebucket"); request.setObjectKey("objectkey"); request.setFile(new File("localfile")); obsClient.putObject(request); System.out.println("putObject successfully"); } catch (ObsException e) { System.out.println("putObject 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("putObject failed"); // 其他异常信息打印 e.printStackTrace(); } 上传内容大小不能超过5GB。 由于 HTTP 编码规范限制,无法发送非 ASCII 码字符,SDK 会在发送请求时对您头域中的中文汉字进行 url 编码,发送编码后数据。如您设置的值 content-disposition 为 ”attachment; filename="中文.txt"”,则对象元数据中存储的信息为”attachment; filename="%E4%B8%AD%E6%96%87.txt"”。使用浏览器访问时浏览器将会自动解码。 如果不需要 SDK 帮您编码,可以调用 PutObjectRequest.setIsEncodeHeaders(false) 关闭自动编码。如需使用该功能,请安装最新版本的SDK。 父主题: 上传对象
  • 指定起始位置列举 以下代码展示如何指定起始位置列举对象: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); ListObjectsRequest request = new ListObjectsRequest("bucketname"); // 设置列举对象名字典序在"test"之后的100个对象 request.setMaxKeys(100); request.setMarker("test"); ObjectListing result = obsClient.listObjects(request); for(ObsObject obsObject : result.getObjects()){ Log.i("ListObjects","\t" + obsObject.getObjectKey()); Log.i("ListObjects","\t" + obsObject.getOwner()); }
  • 分页列举全部对象 以下代码展示分页列举全部对象: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); ListObjectsRequest request = new ListObjectsRequest("bucketname"); // 设置每页100个对象 request.setMaxKeys(100); ObjectListing result; do{ result = obsClient.listObjects(request); for(ObsObject obsObject : result.getObjects()){ Log.i("ListObjects","\t" + obsObject.getObjectKey()); Log.i("ListObjects","\t" + obsObject.getOwner()); } request.setMarker(result.getNextMarker()); }while(result.isTruncated());
  • 简单列举 以下代码展示如何简单列举对象,最多返回1000个对象: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); ObjectListing result = obsClient.listObjects("bucketname"); for(ObsObject obsObject : result.getObjects()){ Log.i("ListObjects", "\t" + obsObject.getObjectKey()); Log.i("ListObjects","\t" + obsObject.getOwner()); } 每次至多返回1000个对象,如果指定桶包含的对象数量大于1000,则返回结果中ObjectListing.isTruncated为true表明本次没有返回全部对象,并可通过ObjectListing.getNextMarker获取下次列举的起始位置。 如果想获取指定桶包含的所有对象,可以采用分页列举的方式。
  • 按文件夹分组列举所有对象 以下代码展示如何按文件夹分组,列举桶内所有对象: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); ListObjectsRequest request = new ListObjectsRequest("bucketname"); request.setMaxKeys(1000); // 设置文件夹分隔符"/" request.setDelimiter("/"); ObjectListing result = obsClient.listObjects(request); Log.i("ListObjects", "Objects in the root directory:"); for(ObsObject obsObject : result.getObjects()){ Log.i("ListObjects","\t" + obsObject.getObjectKey()); Log.i("ListObjects","\t" + obsObject.getOwner()); } listObjectsByPrefix(obsClient, request, result); 递归列出子文件夹中对象的函数listObjectsByPrefix的示例代码如下: static void listObjectsByPrefix(ObsClient obsClient, ListObjectsRequest request, ObjectListing result) throws ObsException { for(String prefix : result.getCommonPrefixes()){ Log.i("ListObjects", "Objects in folder [" + prefix + "]:"); request.setPrefix(prefix); result = obsClient.listObjects(request); for(ObsObject obsObject : result.getObjects()){ Log.i("ListObjects","\t" + obsObject.getObjectKey()); Log.i("ListObjects","\t" + obsObject.getOwner()); } listObjectsByPrefix(obsClient, request, result); } } 以上代码示例没有考虑文件夹中对象数超过1000个的情况。 由于是需要列举出文件夹中的对象和子文件夹,且文件夹对象总是以“/”结尾,因此delimiter总是为“/”。 每次递归的返回结果中ObjectListing.getObjects包含的是文件夹中的对象;ObjectListing.getCommonPrefixes包含的是文件夹的子文件夹。
  • 指定前缀列举 以下代码展示如何指定前缀列举对象: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); ListObjectsRequest request = new ListObjectsRequest("bucketname"); // 设置列举带有prefix前缀的100个对象 request.setMaxKeys(100); request.setPrefix("prefix"); ObjectListing result = obsClient.listObjects(request); for(ObsObject obsObject : result.getObjects()){ Log.i("ListObjects","\t" + obsObject.getObjectKey()); Log.i("ListObjects","\t" + obsObject.getOwner()); }
  • 列举文件夹中的所有对象 OBS本身是没有文件夹的概念的,桶中存储的元素只有对象。文件夹对象实际上是一个大小为0且对象名以“/”结尾的对象,将这个文件夹对象名作为前缀,即可模拟列举文件夹中对象的功能。以下代码展示如何列举文件夹中的对象: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); ListObjectsRequest request = new ListObjectsRequest("bucketname"); // 设置文件夹对象名"dir/"为前缀 request.setPrefix("dir/"); request.setMaxKeys(1000); ObjectListing result; do{ result = obsClient.listObjects(request); for (ObsObject obsObject : result.getObjects()) { Log.i("ListObjects","\t" + obsObject.getObjectKey()); Log.i("ListObjects","\t" + obsObject.getOwner()); } request.setMarker(result.getNextMarker()); }while(result.isTruncated());
  • 指定数目列举 以下代码展示如何指定数目列举对象: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 final ObsClient obsClient = new ObsClient(ak, sk, endPoint); ListObjectsRequest request = new ListObjectsRequest("bucketname"); // 只列举100个对象 request.setMaxKeys(100); ObjectListing result = obsClient.listObjects(request); for(ObsObject obsObject : result.getObjects()){ Log.i("ListObjects","\t" + obsObject.getObjectKey()); Log.i("ListObjects","\t" + obsObject.getOwner()); }
  • 追加上传 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 追加上传可实现对同一个对象追加数据内容的功能。您可以通过ObsClient.appendObject进行追加上传。示例代码如下: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); // 第一次追加上传 AppendObjectRequest request = new AppendObjectRequest(); request.setBucketName("bucketname"); request.setObjectKey("objectname"); request.setPosition(0L); request.setInput(new ByteArrayInputStream("Hello OBS".getBytes())); AppendObjectResult result = obsClient.appendObject(request); // 第二次追加上传 request.setPosition(result.getNextPosition()); request.setInput(new ByteArrayInputStream("Hello OBS Again".getBytes())); result = obsClient.appendObject(request); Log.i("AppendObject", "NextPosition:" + result.getNextPosition()); Log.i("AppendObject", "Etag:" + result.getEtag()); // 通过获取对象属性接口获取下次追加上传的位置 ObjectMetadata metadata = obsClient.getObjectMetadata("bucketname", "objectname"); Log.i("AppendObject", "NextPosition from metadata:" + metadata.getNextPosition()); ObsClient.putObject上传的对象可覆盖ObsClient.appendObject上传的对象,覆盖后对象变为普通对象,不可再进行追加上传。 第一次调用追加上传时,如果已存在同名的普通对象,则会抛出异常(HTTP状态码为409)。 追加上传返回的ETag是追加数据内容的ETag,不是完整对象的ETag。 单次追加上传的内容不能超过5GB,且最多支持10000次追加上传。 追加上传成功后,可通过AppendObjectResult.getNextPosition获取下次追加上传的位置;或者通过ObsClient.getObjectMetadata接口获取下次追加上传的位置。 由于 HTTP 编码规范限制,无法发送非 ASCII 码字符,SDK 会在发送请求时对您头域中的中文汉字进行 url 编码,发送编码后数据。如您设置的值 content-disposition 为 ”attachment; filename="中文.txt"”,则对象元数据中存储的信息为”attachment; filename="%E4%B8%AD%E6%96%87.txt"”。使用浏览器访问时浏览器将会自动解码。 如果不需要 SDK 帮您编码,可以调用 AppendObjectRequest.setIsEncodeHeaders(false) 关闭自动编码。 父主题: 上传对象
  • 设置对象自定义元数据 您可以通过ObjectMetadata.addUserMetadata来设置对象自定义元数据。以下代码展示如何设置对象自定义元数据: // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String endPoint = "https://your-endpoint"; // 创建ObsClient实例 ObsClient obsClient = new ObsClient(ak, sk, endPoint); ObjectMetadata metadata = new ObjectMetadata(); metadata.addUserMetadata("property1", "property-value1"); metadata.getMetadata().put("property2", "property-value2"); obsClient.putObject("bucketname", "objectname", new File("localfile"), metadata);