Creating a General-Purpose File System
Scenarios
General-purpose file systems are containers that store files in SFS. You need to create a general-purpose file system before storing data in SFS.
The following describes how to call the Creating a General-Purpose File System API in a region. For details about the calling method, see Calling APIs.
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 general-purpose file system and obtained the endpoint required for API calls. For details, see Endpoints.
Once a region is determined, it cannot be modified after the creation is complete.
Creating a General-Purpose File System Named filesystem001 in the eu-west-101 Region
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. 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"; // The region where you plan to create the general-purpose file system. public static String endpoint = "sfs3.eu-west-101.myhuaweicloud.eu"; // The address of the General-Purpose File System service. public static String createSfsBody = "<CreateBucketConfiguration >\n" + "<Location>" + region + "</Location>\n" + "</CreateBucketConfiguration>"; public static void main(String[] str) { createFileSystem(); } private static void createFileSystem() { // The general-purpose 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; } } |
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.