更新时间:2024-11-13 GMT+08:00

创建文件系统

操作场景

文件系统是SFS中存储文件的容器。您需要先创建一个文件系统,然后才能在SFS中存储数据。

下面介绍如何调用创建文件系统API在指定的区域创建一个文件系统,API的调用方法请参见如何调用通用文件系统API

前提条件

区域一旦确定,创建完成后无法修改。

在a1区域创建一个名为filesystem001的文件系统

示例中使用通用的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
 98
 99
100
101
102
103
104
105
106
107
108
109
110
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 = System.getenv("HUAWEICLOUD_SDK_AK");
    public static String securityKey = System.getenv("HUAWEICLOUD_SDK_SK"); 
    public static String region = "cn-east-3"; // 取值为规划文件系统所在的区域

    public static String endpoint = "sfs3.a1.region.com"; // 通用文件系统服务地址
    
    public static String createSfsBody =
            "<CreateBucketConfiguration >\n" +
                    "<Location>" + region + "</Location>\n" +
                    "</CreateBucketConfiguration>";

    public static void main(String[] str) {

        createFileSystem();

    }
    private static void createFileSystem() {
        // 文件系统名称
        String fileSystemName = "example-sfs-001";

        String httpMethod = "PUT";
        String date = DateUtils.formatDate(System.currentTimeMillis());
        String contentType = "application/xml";

        /** 根据请求计算签名**/
        String contentMD5 = "";
        String canonicalizedHeaders = "x-obs-bucket-type:SFS";
        String canonicalizedResource = "/" + fileSystemName ;

        // 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);

            URL url = new URL("http://" + endpoint + "/" + fileSystemName);
            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);

            // 增加body体
            OutputStream out = conn.getOutputStream();
            out.write(createSfsBody.getBytes());
            out.flush();
            out.close();

            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 && statusCode != HttpURLConnection.HTTP_NO_CONTENT) {
                InputStream errorStream = conn.getErrorStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream));
                StringBuilder responseBody = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    responseBody.append(line);
                }
                reader.close();

                System.out.println("Error: " + responseBody);
            }
        } 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;
    }
}