华为云OBS文件服务

准备工作

先获取OBS的SK,AK,终端节点。然后创建桶
将以上四个值存放在Nacos中

 /*** 取值为所创建的桶名*/@Value("${obs.bucketName}")private String bucketName;/*** 取值为获取的AK*/@Value("${obs.accessKey}")private String accessKey;/*** 取值为获取的SK*/@Value("${obs.secretKey}")private String securityKey;/*** 取值为获取的终端节点*/@Value("${obs.endpoint}")private String endpoint;

然后加入两个工具类

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;}
}
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);}
}

OBS上传服务

当上传的文件名带有中文时,需要对文件名进行转码处理。否则会导致长度过长或者其他原因上传出错。

public Map<String, String> putObjectToBucket(MultipartFile file) {// 获取文件名String originalFilename = null;try {originalFilename = URLEncoder.encode(Objects.requireNonNull(file.getOriginalFilename()),"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 处理文件名String fileName = originalFilename != null ? originalFilename.substring(0, originalFilename.lastIndexOf(46)) + "_" + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf(46)) : null;CloseableHttpClient httpClient = HttpClients.createDefault();String requestTime = DateUtils.formatDate(System.currentTimeMillis());HttpPut httpPut = new HttpPut(endpoint + "/" + fileName);httpPut.addHeader("Date", requestTime);//根据请求计算签名String contentMD5 = "";String contentType = "";String canonicalizeHeaders = "";String canonicalizeResource = "/" + bucketName + "/" + fileName;// Content-MD5 、Content-Type 没有直接换行, data格式为RFC 1123,和请求中的时间一致String canonicalString = "PUT" + "\n" + contentMD5 + "\n" + contentType + "\n" + requestTime + "\n" + canonicalizeHeaders + canonicalizeResource;System.out.println("StringToSign:[" + canonicalString + "]");try {InputStream inputStream = file.getInputStream();String signature = Signature.signWithHmacSha1(securityKey, canonicalString);// 上传的文件InputStreamEntity entity = new InputStreamEntity(inputStream);httpPut.setEntity(entity);// 增加签名头域 Authorization: OBS AccessKeyID:signaturehttpPut.addHeader("Authorization", "OBS " + accessKey + ":" + signature);CloseableHttpResponse 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(httpResponse.getStatusLine().getStatusCode());// 判断响应结果是否成功,此处返回文件在OBS中存储的路径及经过处理之后的文件名用来存入库if (httpResponse.getStatusLine().getStatusCode() == 200) {Map<String, String> map = new HashMap<>();if (fileName != null){map.put("fileName", URLDecoder.decode(fileName,"utf-8"));map.put("path",endpoint + "/" + fileName);return map;}return null;}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return null;}

OBS下载服务

下载主题类

此处还需要改进。下载的文件名如果是带有中文,文件名会乱码。目前测试过很多转码,解码方式。均未成功。

public void download(@RequestParam("fileId")String fileId, HttpServletRequest request, HttpServletResponse response) {try {CloseableHttpClient httpClient = HttpClients.createDefault();SysFile sysFile = mapper.getPathAndFileName(fileId);if (sysFile == null){return;}String fileName = sysFile.getFileName();HttpResponse httpResponse = utils.fileDownload(httpClient, sysFile);InputStream inputStream = httpResponse.getEntity().getContent();// 缓冲文件输出流BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());// 为防止 文件名出现乱码final String userAgent = request.getHeader("USER-AGENT");// IE浏览器if (StringUtils.contains(userAgent, "MSIE")) {fileName = URLEncoder.encode(fileName, "UTF-8");} else {// google,火狐浏览器if (StringUtils.contains(userAgent, "Mozilla")) {fileName = new String(fileName.getBytes(), "ISO8859-1");} else {// 其他浏览器fileName = URLEncoder.encode(fileName, "UTF-8");}}response.setContentType("application/x-download");// 设置让浏览器弹出下载提示框,而不是直接在浏览器中打开response.addHeader("Content-Disposition", "attachment;filename=" + fileName);IOUtils.copy(inputStream, outputStream);outputStream.flush();inputStream.close();outputStream.close();try {httpClient.close();} catch (IOException e) {e.printStackTrace();}} catch (Exception e) {e.printStackTrace();}}

下载工具类

下载其实就是将上传到额httpPut请求改成httpGet

 /*** 从obs下载文件* @param httpClient 连接* @param sysFile 文件实体* @return 文件流*/public CloseableHttpResponse fileDownload(CloseableHttpClient httpClient,SysFile sysFile) {String requestTime = DateUtils.formatDate(System.currentTimeMillis());HttpGet httpGet = new HttpGet(sysFile.getPath());httpGet.addHeader("Date", requestTime);// 根据请求计算签名String contentMD5 = "";String contentType = "";String canonicalizeHeaders = "";String canonicalizeResource = null;try {canonicalizeResource = "/" + bucketName + "/" + URLEncoder.encode(sysFile.getFileName(),"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}// Content-MD5 、Content-Type 没有直接换行, data格式为RFC 1123,和请求中的时间一致String canonicalString = "GET" + "\n" + contentMD5 + "\n" + contentType + "\n" + requestTime + "\n" + canonicalizeHeaders + canonicalizeResource;System.out.println("StringToSign:[" + canonicalString + "]");try {String signature = Signature.signWithHmacSha1(securityKey, canonicalString);httpGet.setHeader("Authorization", "OBS " + accessKey + ":" + signature);CloseableHttpResponse httpResponse = httpClient.execute(httpGet);// 打印发送请求信息和收到的响应消息System.out.println("Request Message:");System.out.println(httpGet.getRequestLine());for (Header header : httpGet.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());}return httpResponse;} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {}return null;}

此处放一个常见下载格式的链接

常见MIME类型列表

华为云OBS文件服务相关推荐

  1. 华为云OBS文件上传和下载

    华为云Obs文件上传和下载 使用的技术 前端是Vue框架,element-ui 后端是Springboot项目 服务器是华为云 文件上传下载地方是华为云Obs对象存储服务 1.前端上传代码 el-up ...

  2. 华为云OBS文件上传下载工具类

    Java-华为云OBS文件上传下载工具类 文章目录 Java-华为云OBS文件上传下载工具类 1.华为云obs文件上传下载 2.文件流转MultipartFile 3.File转换为Multipart ...

  3. 华为云 obs 文件上传 及防盗链设置有效时间访问链接

    华为官方文档位置 本文适合小白和新手 ,仅满足基本文件上传 和 访问 maven引入华为云 obs jar文件 <dependency><groupId>com.huaweic ...

  4. 华为云弹性文件服务 SFS

    挂载NFS文件系统到云服务器(Linux) 参考链接:https://support.huaweicloud.com/qs-sfs/zh-cn_topic_0034428728.html 弹性文件服务 ...

  5. 华为云对象存储服务OBS教你一招轻松解决存储难题

    身处于信息爆炸的时代,各种各样的数据琳琅满目,需要记录存储的资料和信息数不胜数,有时候个人都会感觉到存储空间不足,更何况是一些正处于发展阶段中小型企业?那对于存储的需求就更迫切了. 遇见这种问题,很多 ...

  6. sscom串口网络数据调试器使用post方法向华为云obs桶上传文件和图片

    原贴地址:sscom串口网络数据调试器使用post方法向华为云obs桶上传文件和图片-云社区-华为云 [摘要] 之前发了文章"postman使用post方法向华为云obs桶上传文件和图片&q ...

  7. 华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单

    随着产业数字化转型大潮的到来,企业生产经营过程中产生的数据也越来越多,不管是大型企业还是小微企业对数据存储备份的要求也越来越高,有的企业选择自购硬件设备进行存储,一方面需要付出高昂的成本,另一方面如果 ...

  8. Springboot 从华为云OBS中打包下载文件到本地

    文章目录 前言 一.OBS是什么? 二.使用步骤 1.引入依赖 2.获取obs中的一些参数:endPoint,ak,sk还有桶名(重要,必须要有). 3.开始下载 4.设置out流的打包下载 总结 前 ...

  9. 前端js华为云obs上传下载文件与进度条的设置

    前端js华为云obs上传下载文件与进度条的设置 首先下载OBS BrowserJS SDK安装包 用git将代码拉到本地 git clone https://github.com/huaweiclou ...

最新文章

  1. 牛逼!用 12 万行代码堆出来个 蔡徐坤,编译还能通过!
  2. RESTful 规范
  3. python 文件和目录操作
  4. Java进阶篇(六)——Swing程序设计(上)
  5. C语言面向对象编程(六):配置文件解析
  6. 《深入.NET平台和C# 编程》内部测试 笔试题
  7. python openstack rabbitmq_OpenStack--Rabbitmq组件消息队列
  8. LeetCode | 我的LeetCode之旅(持续更新ing)
  9. Bootstrap系列 -- 36. 向上弹起的下拉菜单
  10. 第一个自动化运维程序
  11. 阿里巴巴正式上线全球首个数据中心Open Channel SSD产品
  12. python debug run 结果不同_Python:PyCharm中运行与调试模式下的不同行为
  13. 2017 ACM-ICPC南宁网络赛: I. GSM Base Station Identification(线性变换)
  14. 【转】Jenkins+Ant+Jmeter接口自动化集成测试实例
  15. 【转】一定要亲身经历了之后才能明白?
  16. 银行笔试题 java笔试题
  17. (二十二)【模电】(波形的发生与信号的转换)电压比较器
  18. 2+22+222+2222+。。。。
  19. 神探狄仁杰是一个Debug高手
  20. Centos7.4安装Nginx实战

热门文章

  1. 四川大学计算机学院现代软件工程(双语 百度云,四川大学2012软件工程导论(双语) (A 闭 )...
  2. 苹果系统模拟器_开发者成功在苹果MacBook上通过模拟器正常运行Windows 10X版
  3. 【可见光室内定位】(一)概览
  4. char与varchar详解
  5. 【计算机毕业设计】201论坛系统设计与实现
  6. $.contains()
  7. oracle 删除定时任务 、查询定时任务、暂停定时任务、创建定时任务
  8. PL/SQL计算质数
  9. 02-网络为什么要分层
  10. 计算机如何用蓝牙实现文件传输,Win10系统电脑通过蓝牙进行传输文件操作步骤...