forked from docs/doc-exports
Reviewed-by: Muller, Martin <martin.muller@t-systems.com> Co-authored-by: zhangyue <zhangyue164@huawei.com> Co-committed-by: zhangyue <zhangyue164@huawei.com>
37 KiB
37 KiB
Creating a File System
Scenarios
A file system is a container that store files in SFS. You need to create a file system before storing data in SFS.
The following describes how to call the API for Creating a File System in a region. For details, see Calling APIs (General Purpose File System) (BETA).
Prerequisites
- You have obtained the AK and SK. For details, see Obtaining Access Keys (AK/SK).
- You have planned the region where you want to create a file system and obtained the endpoint required for API calls. For details, see Regions and Endpoints.
Once a region is determined, it cannot be modified after the bucket is created.
Creating a File System Named filesystem001 in the eu-de Region
In this example, an Apache HttpClient is used.
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 { //Obtain an AK/SK pair using environment variables or import the AK/SK pair in other ways. Using hard coding may result in leakage. //Obtain an AK/SK pair on the management console. String accessKey = System.getenv("YOUR_SDK_AK"); String securityKey = System.getenv("YOUR_SDK_SK"); String region = "eu-de"; // The region where you plan to create the file system. String endpoint = "sfs3.eu-de.region.com"; // The access address of General Purpose File System String createSfsBody = "<CreateBucketConfiguration >\n" + "<Location>" + region + "</Location>\n" + "</CreateBucketConfiguration>"; public static void main(String[] str) { createFileSystem(); } private static void createFileSystem() { // The file system name. String fileSystemName = "example-sfs-001"; String httpMethod = "PUT"; String date = DateUtils.formatDate(System.currentTimeMillis()); String contentType = "application/xml"; /**Calculate the signature based on the request.**/ String contentMD5 = ""; String canonicalizedHeaders = "x-obs-bucket-type:SFS"; String canonicalizedResource = "/" + fileSystemName ; // Content-MD5 and Content-Type fields do not contain line breaks. The data format is RFC 1123, which is the same as the time in the request. 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(); // Add a signature header. 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); // Add a body. OutputStream out = conn.getOutputStream(); out.write(createSfsBody.getBytes()); out.flush(); out.close(); String status = conn.getHeaderField(null); System.out.println(status); // Output the response message. 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); } } } // Handle the request error. 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(); } } } } |
The format of the Date header field DateUtils is as follows:
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); } } |
The method of calculating the signature character string is as follows:
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; } } |
Parent topic: Getting Started (General Purpose File System) (BETA)