更新时间:2024-01-02 GMT+08:00
上传对象
前提条件
- 已获取AK和SK,获取方法参见获取访问密钥(AK/SK)。
- 已创建了至少一个可用的桶。
- 已准备好了待上传的文件,并清楚文件所在的本地完整路径。
- 您需要知道待上传桶所在的区域信息,并根据区域确定调用API的Endpoint,详细信息请参见终端节点。
向a1区域的桶bucket001中上传对象,名称为objecttest1
示例中使用通用的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 |
package com.obsclient;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
public class TestMain {
/* 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。*/
public static String accessKey = System.getenv("HUAWEICLOUD_SDK_AK"); //取值为获取的AK
public static String securityKey = System.getenv("HUAWEICLOUD_SDK_SK"); //取值为获取的SK
public static void main(String[] str) {
putObjectToBucket();
}
private static void putObjectToBucket() {
InputStream inputStream = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse httpResponse = null;
String requestTime = DateUtils.formatDate(System.currentTimeMillis());
HttpPut httpPut = new HttpPut("http://bucket001.obs.a1.example.com/objecttest1");
httpPut.addHeader("Date", requestTime);
/** 根据请求计算签名 **/
String contentMD5 = "";
String contentType = "";
String canonicalizedHeaders = "";
String canonicalizedResource = "/bucket001/objecttest1";
// Content-MD5 、Content-Type 没有直接换行, data格式为RFC 1123,和请求中的时间一致
String canonicalString = "PUT" + "\n" + contentMD5 + "\n" + contentType + "\n" + requestTime + "\n" + canonicalizedHeaders + canonicalizedResource;
System.out.println("StringToSign:[" + canonicalString + "]");
String signature = null;
try {
signature = Signature.signWithHmacSha1(securityKey, canonicalString);
// 上传的文件目录
inputStream = new FileInputStream("D:\\OBSobject\\text01.txt");
InputStreamEntity entity = new InputStreamEntity(inputStream);
httpPut.setEntity(entity);
// 增加签名头域 Authorization: OBS AccessKeyID:signature
httpPut.addHeader("Authorization", "OBS " + accessKey + ":" + signature);
httpResponse = httpClient.execute(httpPut);
// 打印发送请求信息和收到的响应消息
System.out.println("Request Message:");
System.out.println(httpPut.getRequestLine());
for (Header header : httpPut.getAllHeaders()) {
System.out.println(header.getName() + ":" + header.getValue());
}
System.out.println("Response Message:");
System.out.println(httpResponse.getStatusLine());
for (Header header : httpResponse.getAllHeaders()) {
System.out.println(header.getName() + ":" + header.getValue());
}
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = reader.readLine()) != null) {
response.append(inputLine);
}
reader.close();
// print result
System.out.println(response.toString());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
|
其中Date头域DateUtils的格式为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.obsclient;
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.obsclient;
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;
}
}
|
父主题: 快速入门