首先我们要添加对应的依赖

        <dependency><groupId>com.huaweicloud</groupId><artifactId>esdk-obs-java</artifactId><version>3.20.6.1</version></dependency>

不要忘记在启动类上添加

    @Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}

然后在对应的配置文件添加华为云对应的密钥,没有的话可以去华为云获取对应密钥

#obs
huawei:obs:ak: xxxxxxxxxxxxsk: xxxxxxxxxxxxxxupload:endPoint: obs.xxxxxx.xxxxxx.combucketName: xxxxxparentDir:  xxx

然后我们创建对应的config类

package Hwei.OBS.demo.config;import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;/*** 华为obs配置类*/
@Data
@Slf4j
@Configuration
public class HweiOBSConfig {@Value("${huawei.obs.ak:home}")private String accessKey;@Value("${huawei.obs.sk:home}")private String securityKey;@Value("${huawei.obs.upload.endPoint:home}")private String endPoint;@Value("${huawei.obs.bucketName:home}")private String bucketName;/*** 创建实例* @return*/public ObsClient getInstance(){return new ObsClient(accessKey,securityKey,endPoint);}/*** 销毁实列* @param obsClient*/public void destroy(ObsClient obsClient)  {try{obsClient.close();}catch (ObsException e){log.error("obs执行失败",e);}catch (Exception e){log.error("执行失败",e);}}}

这里我把需要的上传下载的方法封装起来了,这里获取到了文件上传的进度,如果前后台分离可以使用webSocket进行实时通讯,在这里就不详细讲了。

package Hwei.OBS.demo.util;import Hwei.OBS.demo.config.HweiOBSConfig;
import Hwei.OBS.demo.dto.FileUploadStatus;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.*;import jdk.internal.util.xml.impl.Input;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;@Slf4j
@Configuration
public class HweiOBSUtil {@Autowiredprivate HweiOBSConfig hweiOBSConfig;/*** 文件上传* @param uploadFile 上传的文件* @param FileName 文件名称* @return 返回的路径*/public PutObjectResult fileUpload(MultipartFile uploadFile, String FileName){ObsClient obsClient=null;try {//创建实例obsClient = hweiOBSConfig.getInstance();//获取文件信息InputStream inputStream = uploadFile.getInputStream();UploadFileRequest request1 = new UploadFileRequest(hweiOBSConfig.getBucketName(), FileName);long available = inputStream.available();PutObjectRequest request = new PutObjectRequest(hweiOBSConfig.getBucketName(), java.lang.String.valueOf(FileName), inputStream);ObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setContentLength(available);request.setMetadata(objectMetadata);//设置公共读request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);PutObjectResult putObjectResult = obsClient.putObject(request);return putObjectResult;} catch (IOException e) {e.printStackTrace();}finally {//销毁实例hweiOBSConfig.destroy(obsClient);}return null;}/*** 获取文件上传进度* @param fileName* @return*/public FileUploadStatus getFileUploadPlan(String objectName){ObsClient obsClient=null;FileUploadStatus fileUploadStatus = new FileUploadStatus();try {obsClient=hweiOBSConfig.getInstance();GetObjectRequest request = new GetObjectRequest(hweiOBSConfig.getBucketName(), objectName);request.setProgressListener(new ProgressListener() {@Overridepublic void progressChanged(ProgressStatus status) {//上传的平均速度fileUploadStatus.setAvgSpeed(status.getAverageSpeed());//上传的百分比fileUploadStatus.setPct(String.valueOf(status.getTransferPercentage()));}});// 每下载1MB数据反馈下载进度request.setProgressInterval(1024*1024L);ObsObject obsObject = obsClient.getObject(request);// 读取对象内容InputStream input= obsObject.getObjectContent();byte[] b = new byte[1024];ByteArrayOutputStream byteArrayOutputStream= new ByteArrayOutputStream();int len;while ((len=input.read(b))!=-1 ){//将每一次的数据写入缓冲区byteArrayOutputStream.write(b,0,len);}byteArrayOutputStream.close();input.close();return fileUploadStatus;}catch (Exception e){e.printStackTrace();}finally {hweiOBSConfig.destroy(obsClient);}return null;}/*** 文件下载* @param request* @param response* @param fileName 文件名称* @return*/public int fileDownload(HttpServletRequest request, HttpServletResponse response, String fileName){try {ObsClient obsClient = hweiOBSConfig.getInstance();ObsObject obsObject = obsClient.getObject(hweiOBSConfig.getBucketName(), fileName);InputStream input = obsObject.getObjectContent();//缓冲文件输出流BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());//设置让浏览器弹出下载提示框,而不是直接在浏览器中打开response.addHeader("Content-Disposition", "attachment;filename=" + fileName);IOUtils.copy(input,outputStream);outputStream.flush();outputStream.close();input.close();return 0;}catch (Exception e){log.error("文件下载失败:{}",e.getMessage());return 1;}}
}

对应的Controller,这里在上传的时候去校验redis是否有上传成功的,如果有就直接返回对应的值,实现了秒传的效果。

package Hwei.OBS.demo.controller;import Hwei.OBS.demo.config.WebSocketHandler;
import Hwei.OBS.demo.dto.FileUploadStatus;
import Hwei.OBS.demo.dto.R;
import Hwei.OBS.demo.dto.fileChunkDto;
import Hwei.OBS.demo.util.FileUtil;
import Hwei.OBS.demo.util.HweiOBSUtil;
import cn.hutool.crypto.SecureUtil;
import com.obs.services.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
@RequestMapping("huawei/obs")
public class ObsController {@Autowiredprivate HweiOBSUtil hweiOBSUtil;@Autowiredprivate WebSocketHandler webSocketHandler;@Resourceprivate RedisTemplate redisTemplate;/*** 文件上传* @param uploadFile* @return*/@PostMapping("fileUpload")public R fileUpload(MultipartFile uploadFile){//讲文件转换为md5,实现唯一性String fileString = FileUtil.MultipartFileToString(uploadFile);String fileMd5 = SecureUtil.md5(fileString);//reids是否存在if (redisTemplate.hasKey(fileMd5)){//存在返回名称String  fileUrl = (String) redisTemplate.opsForValue().get(fileMd5);return R.ok().data(fileUrl);}else{//不存在上传并放入redisPutObjectResult putObjectResult = hweiOBSUtil.fileUpload(uploadFile, uploadFile.getOriginalFilename());if (putObjectResult!=null){redisTemplate.opsForValue().set(fileMd5,putObjectResult.getObjectUrl());return R.ok().data(putObjectResult.getObjectKey());}else{return R.error();}}}/*** 查询上传进度* @param fileName*/@GetMapping("realFilePlan")public void redalFilePlan(String fileName) {FileUploadStatus fileUploadPlan = hweiOBSUtil.getFileUploadPlan(fileName);webSocketHandler.sendAllMessage(fileUploadPlan.getPct());}/*** 下载文件* @param request* @param response* @param fileName* @return*/@GetMapping("fileDownload")public R fileDownload(HttpServletRequest request, HttpServletResponse response, String fileName){int i = hweiOBSUtil.fileDownload(request, response, fileName);if(i==0){return null;}return R.error();}}

对应的MultipartFile转成String

package Hwei.OBS.demo.util;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartFile;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;@Slf4j
@Configuration
public class FileUtil {/*** MultipartFile转成String* @param file* @return*/public static String MultipartFileToString(MultipartFile file){InputStreamReader isr;BufferedReader br;StringBuilder txtResult = new StringBuilder();try {isr = new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8);br = new BufferedReader(isr);String lineTxt;while ((lineTxt = br.readLine()) != null) {txtResult.append(lineTxt);}isr.close();br.close();return txtResult.toString();} catch (IOException e) {e.printStackTrace();return "";}}
}

SpringBoot整合华为云OBS实现文件上传下载相关推荐

  1. 基于华为云obs实现文件上传下载(技术栈mysql+springboot+Maven+jsp+java)的技术分享

    基于华为云obs实现文件上传下载(技术栈mysql+springboot+jsp+java)的技术分享 obs实现文件上传下载 前言 一.OBS是什么? 二.使用步骤 1.1 前期准备 2 工具的内容 ...

  2. SpringBoot 系列教程(九十九):SpringBoot整合阿里云OSS实现文件上传,下载,删除功能

    一.前言 之所以写这篇文章呢? 是因为最近在做文件上传时遇到一个问题,就是我们在以前使用传统Spring+SpringMVC+Mybatis框架开发Web项目的时候,都是将项目打包生成一个War包,然 ...

  3. SpringBoot整合华为云OBS

    一.参考项 华为云 OBS(官网): 对象存储服务OBS官网_海量安全高可靠_数据云存储解决方案-华为云 OBS SDK for Java(官网): SDK下载_对象存储服务 OBS_Java_华为云 ...

  4. 基于Springboot外卖系统13:实现文件上传下载模块

    1. 上传功能模块 1.1 上传概述 文件上传,也称为upload,是指将本地图片.视频.音频等文件上传到服务器上,可以供其他用户浏览或下载的过程. 文件上传时,对页面的form表单有如下要求: 表单 ...

  5. 基于华为云obs的springMVC文件上传下载,简单demo

    使用华为云的obs作为文件服务 使用springdata jpa框架操作数据库 创建springboot项目,添加华为云obs的SDK的maven依赖 <!-- 开启spring配置类 --&g ...

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

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

  7. Nginx的安装基础配置(windows、linux)以及搭建图片服务器(windows、阿里云),文件上传

    Nginx的安装基础配置(windows.linux)以及搭建图片服务器(windows.阿里云),文件上传 本文目录 文章目录 Nginx的安装基础配置(windows.linux)以及搭建图片服务 ...

  8. 使用阿里云OSS实现文件上传

    概述场景 文件上传,是程序开发中必须会使用到的一个功能,比如: 添加商品,用户头像,文章封面等需求 富文本编辑(插件文件上传) 文件上传的原理是什么? 我们为什么要实现文件上传,其实就要共享资源,大家 ...

  9. SpringMVC整合fastdfs-client-java实现web文件上传下载

    为什么80%的码农都做不了架构师?>>>    版权声明:本文为博主原创文章,转载请标明出处(http://blog.csdn.net/wlwlwlwl015)Thanks. 目录( ...

最新文章

  1. 团队作业10——复审与事后分析(Beta版本)
  2. Android之Handler用法总结(1)
  3. android 开发 短信,Android开发之短信发送
  4. 如何把Access转成SQL Server的方法介绍
  5. AsynTask用法
  6. 自动化运维之 - puppet 服务端安装
  7. python兼职程序员工资-Python 程序员的工资能有多高?
  8. 2017.0713.《计算机组成原理》-汉明码
  9. 【回归预测】基于matlab灰狼算法优化ELMAN神经网络回归预测【含Matlab源码 1782期】
  10. 【CF585-div2:C】Swap Letters(贪心)
  11. ff14离线查看客户端日志小技巧
  12. 计算机考试的话语,鼓励别人考试的句子
  13. 自动化有道云笔记自动签到+看广告奖励
  14. 计算机桌面调音量的图标不见了,如何解决电脑音量图标不见了
  15. 论坛.newreply.php,discuz!论坛帖、删帖加减金钱值后台设定For D25sp1 4.3日整理版
  16. 等额本息和等额本金还款在R中的实现
  17. VLC的windows版本下载
  18. 国产化操作系统的参考
  19. 如何看hbo_哪些设备支持HBO Max? Roku和Amazon Fire TV不要
  20. Maven学习——maven基础

热门文章

  1. 定西计算机职称报名时间,定西2012年职称计算机考试报名时间
  2. 设置response相应头用于浏览器下载文件
  3. 那些年纪大的程序员都怎么样了?炸出一堆60多岁的程序员
  4. 【JiyaChieng】(零)Jiya和Chieng的故事
  5. QCSG1205031通信协议的研究与模拟服务器开发
  6. 《杀戮地带2》中的延迟渲染
  7. 服务器中毒了,无法登陆,开启拷贝恢复之路
  8. IT时代的摇滚巨星:史蒂夫 乔布斯
  9. redis服务器错误日志分析
  10. Ubuntu20.04安装英伟达显卡驱动,疑难问题解决