OSS签名Header实现Demo(Java)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介:

概述

OSS的集成上传和下载提供了SDK可以直接使用,但实际使用中一些用户受限环境或者设备限制需要使用api方式来实现上传和下载,本文以PutObject接口为例,提供了java实现的demo。
注:建议优先使用OSS提供SDK,本文提供的只是签名实现上传demo,实际使用中需要结合业务来进行改动代码

详细信息

PutObject实现demo(测试环境JDK1.8):


import org.apache.commons.codec.binary.Base64;

import javax.crypto.Mac;

import javax.crypto.spec.SecretKeySpec;

import java.io.*;

import java.net.HttpURLConnection;

import java.net.URL;

import java.text.SimpleDateFormat;

import java.util.*;

public class OssSignHeader {

private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1"; 

private final static String CHARSET_UTF8 = "utf8";

private final static String ALGORITHM = "HmacSHA1";

public static String hmacSha1(String data, String key) {

try {

Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);

SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);

mac.init(keySpec);

byte[] rawHmac;

rawHmac = mac.doFinal(data.getBytes(CHARSET_UTF8));

return new String(Base64.encodeBase64(rawHmac));

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public static String buildSignData(String Date,String VERB,String CanonicalizedResource){

String signData = "PUT" + "\n"+ "\n"+ "\n"

+ Date + "\n"

+ CanonicalizedResource;

return signData;

}

public static String getGMTDate(){

Calendar cd = Calendar.getInstance();

SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);

sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

String str = sdf.format(cd.getTime());

return str;

}

public static void main(String[] args) throws Exception{

String date = getGMTDate();

String ossBucket= "您的bucket名称";

String accessKeyId= "您的AccessKey";

String secretAccessKey= "您的AccessSecret";

String resourcePath = "/xx/panda/102283/111.txt";

String resourcePath1 = "panda/102283/111.txt";

String VERB = "GET";

String url = "http://"+ossBucket+".oss-cn-hangzhou.aliyuncs.com/";

String Signature = (hmacSha1(buildSignData(date,VERB,resourcePath),secretAccessKey));

String Authorization = "OSS " + accessKeyId + ":" + Signature;

System.out.println(Authorization);

Map<String,String> head = new HashMap<String,String>();

head.put("Date",date);

head.put("Authorization",Authorization);

URL url1 = new URL(url + resourcePath1);

HttpURLConnection connection ;

StringBuffer sbuffer=null;

try {

//添加 请求内容

connection= (HttpURLConnection) url1.openConnection();

//设置http连接属性

connection.setDoOutput(true);// http正文内,因此需要设为true, 默认情况下是false;

connection.setRequestMethod("PUT"); // 可以根据需要 提交 GET、POST、DELETE、PUT等http提供的功能

//connection.setUseCaches(false);//设置缓存,注意设置请求方法为post不能用缓存

// connection.setInstanceFollowRedirects(true);

connection.setRequestProperty("Date", date);  //设置请 求的服务器网址,域名,例如***.**.***.***

connection.setRequestProperty("Authorization", Authorization);//设定 请求格式 json,也可以设定xml格式的

//connection.setRequestProperty("Content-Length", obj.toString().getBytes().length + ""); //设置文件请求的长度 

 

connection.setReadTimeout(10000);//设置读取超时时间          

connection.setConnectTimeout(10000);//设置连接超时时间           

connection.connect();            

OutputStream out = connection.getOutputStream();//向对象输出流写出数据,这些数据将存到内存缓冲区中          

out.write(new String("测试数据").getBytes());            //out.write(new String("测试数据").getBytes());            //刷新对象输出流,将任何字节都写入潜在的流中       

out.flush();     

// 关闭流对象,此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中          

out.close();           

//读取响应           

if (connection.getResponseCode()==200)            {

// 从服务器获得一个输入流

InputStreamReader inputStream =new InputStreamReader(connection.getInputStream());//调用HttpURLConnection连接对象的getInputStream()函数, 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。

BufferedReader reader = new BufferedReader(inputStream); 

 

String lines;                

sbuffer= new StringBuffer(""); 

 

while ((lines = reader.readLine()) != null) {                

lines = new String(lines.getBytes(), "utf-8");                    

sbuffer.append(lines);                }                

reader.close();         

}else{          

System.out.println(connection.getResponseCode()); 

}    

//断开连接           

connection.disconnect();

System.out.println("OK  "+url1);

} catch (IOException e) { 

e.printStackTrace();     

}   

}

}

相关文档

OSS在Header中包含签名

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
6月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
1066 1
|
26天前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
45 1
|
5月前
|
Java 对象存储
java对接阿里云OSS上传
java对接阿里云OSS上传
368 2
|
5月前
|
Java 对象存储
java对接七牛云OSS上传
java对接七牛云OSS上传
47 2
|
5月前
|
Java 对象存储
阿里云OSS上传下载文件java
阿里云OSS上传下载文件java
333 0
|
6月前
|
运维 编译器 API
对象存储oss使用问题之进行文件上传时报错java.io.EOFException如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
282 0
|
存储 Java 对象存储
【2】从零玩转OSS阿里云存储服务之Java代码操作
【2】从零玩转OSS阿里云存储服务之Java代码操作
700 0
|
4月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
7天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
3月前
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决