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 General Purpose File System 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 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 a1 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 file system. public static String endpoint = "sfs3.a1.region.com"; // The access address of General Purpose File System. public static 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; } } |
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.See the reply and handling status in My Cloud VOC.
For any further questions, feel free to contact us through the chatbot.
Chatbot