弹性文件服务 SFS
弹性文件服务 SFS
- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
- 最佳实践
- API参考
- SDK参考
- 场景代码示例
-
常见问题
- 概念类
- 规格类
- 限制类
- 网络类
- 计费类
-
其他类
- 如何从云服务器访问文件系统?
- 如何确认Linux云服务器上的文件系统处于可用状态?
- 弹性文件服务会占用用户的哪些资源?
- SFS容量型文件系统挂载后为什么容量显示为10P?
- 通用文件系统挂载后为什么会显示250TB?
- 如何在弹性文件服务SFS和对象存储服务OBS之间进行数据迁移?
- 弹性文件服务支持多可用区吗?
- 可以将SFS容量型文件系统升级为SFS Turbo文件系统吗?
- 可以将SFS Turbo标准型升级为SFS Turbo标准型-增强版吗?
- 如何在弹性文件服务SFS和云硬盘EVS之间进行数据迁移?
- 可以直接从云下访问弹性文件服务吗?
- 如何删除.nfs类型的文件?
- 将数据从SFS容量型迁移至SFS Turbo后,容量为什么变大了?
- 如何提高SFS Turbo文件系统拷贝和删除操作的效率?
- SFS Turbo二级及三级目录权限如何继承?
- 如何将SFS Turbo部署至CCE?
- 如何发挥SFS Turbo文件系统的最大性能?
- Linux内核5.4版本之后客户端的NFSv3文件系统顺序读业务场景性能不符合预期,如何处理?
- 故障排除
- 视频帮助
- 文档下载
- 通用参考
本文导读
链接复制成功!
获取文件系统列表
前提条件
- 已获取AK和SK,获取方法参见获取访问密钥(AK/SK)。
- 您需要明确需要列举的文件系统所在的区域信息,并根据区域确定调用API的Endpoint,详细信息请参见地区和终端节点。
获取cn-north-4区域的文件系统列表
示例中使用通用的Apache Http Client。
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
package com.sfsclient; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; public class TestMain { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK public static String accessKey = "ACCESS_KEY_ID"; public static String securityKey = "SECRET_ACCESS_KEY_ID"; public static String endpoint = "sfs3.cn-east-3.myhuaweicloud.com"; // 通用文件系统服务地址 public static void main(String[] str) { createFileSystem(); } private static void listFileSystem() { String httpMethod = "GET"; String date = DateUtils.formatDate(System.currentTimeMillis()); /** 根据请求计算签名**/ String contentMD5 = ""; String contentType = ""; String canonicalizedHeaders = "x-obs-bucket-type:SFS"; String canonicalizedResource = "/" ; // Content-MD5 、Content-Type 没有直接换行, data格式为RFC 1123,和请求中的时间一致 String stringToSign = httpMethod + "\n" + contentMD5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedHeaders + "\n" + canonicalizedResource; System.out.printf("StringToSign:\n[%s]\n\n", stringToSign); HttpURLConnection conn = null; try { String signature = Signature.signWithHmacSha1(securityKey, stringToSign); String authorization= "OBS " + accessKey + ":" + signature; System.out.printf("authorization:%s\n\n", authorization); // 创建http请求 URL url = new URL("http://" + endpoint); conn = (HttpURLConnection) url.openConnection(); // 增加签名头域 conn.setRequestMethod(httpMethod); conn.setRequestProperty("Date", date); conn.setRequestProperty("Content-Type", contentType); conn.setRequestProperty("x-obs-bucket-type", "SFS"); conn.setRequestProperty("Authorization", authorization); conn.setDoOutput(true); String status = conn.getHeaderField(null); System.out.println(status); // 输出收到的响应消息 Map<String, List<String>> headers = conn.getHeaderFields(); for (Map.Entry<String, List<String>> entry : headers.entrySet()) { String key = entry.getKey(); List<String> values = entry.getValue(); if (key != null) { for (String value : values) { System.out.println(key + ": " + value); } } } // 请求返回内容处理 int statusCode = conn.getResponseCode(); if (statusCode == HttpURLConnection.HTTP_OK) { InputStream responseStream = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(responseStream)); StringBuilder responseBody = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { responseBody.append(line); } reader.close(); System.out.println("responseBody: " + responseBody); } else { System.out.println("Error: " + statusCode); } } catch (IOException e) { e.printStackTrace(); } finally { if (conn != null){ conn.disconnect(); } } } } |
其中Date头域DateUtils的格式为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.sfsclient; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Locale; import java.util.TimeZone; public class DateUtils { public static String formatDate(long time) { DateFormat serverDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH); serverDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); return serverDateFormat.format(time); } } |
签名字符串Signature的计算方法为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.sfsclient; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.security.InvalidKeyException; import java.util.Base64; public class Signature { public static String signWithHmacSha1(String sk, String canonicalString) throws UnsupportedEncodingException { try { SecretKeySpec signingKey = new SecretKeySpec(sk.getBytes("UTF-8"), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); return Base64.getEncoder().encodeToString(mac.doFinal(canonicalString.getBytes("UTF-8"))); } catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) { e.printStackTrace(); } return null; } } |
父主题: 通用文件系统快速入门