B087-人力资源项目-文件上传课程分类

news2024/12/23 4:15:50

目录

      • 背景
      • 控制台操作
        • 开通OSS服务
        • 创建存储空间
      • 项目工程准备
        • 概述
        • 新建文件管理模块
        • 把文件上传到OSS的三种方案
      • 通过官方文档完成demo上传
        • 官方文档找JavaSDK
        • 文件上传思路
        • 代码

背景

为什么要交给第三方文件管理服务管理?

最传统的的文件管理方案是把文件存储到项目中本地 “/webapp/upload/”,把文件的地址保存到数据库,客户端获取到图片的地址就可以浏览或者下载文件。这种管理方式是把文件交给应用本身来处理,文件不仅要占用应用服务器的空间资源,文件的读取以及把文件响应给客户端给应用服务器也带来很大的压力,并且在分布式/集群环境中存在文件不共享的问题。

在分布式/集群环境中需要采用统一的文件处理方案,文件不需要应用本身来管理,而是交给专门的文件服务器来实现文件的上传,下载以及删除操作,这样的好处是应用服务器不再处理图片压力减轻,图片不会占用应用服务器本身的空间资源,并且统一的文件服务器实现的文件的共享,所有的微服务都可以通过文件服务器来上传和下载文件。

另外第三方文件管理服务服务完善,包括图片鉴黄,处理政治,邪教,传销等敏感信息,图片瘦身,水印等。

为什么没再用fastDFS,大城市大企业很少用,成本也不低。自己搭的出了问题需要自己维护,没有第三方稳定。

阿里云OSS处理方案:https://blog.csdn.net/u014494148/article/details/108858360

官方文档:https://help.aliyun.com/document_detail/31886.html

控制台操作

开通OSS服务

阿里云官网 - 产品 - 存储 - 对象存储 OSS - 立即开通/管理控制台(由于已经开通)

创建存储空间

Bucket 列表 - 创建bucket(注意名称不要写中文 最好英文字母加数字 也可以加横杠)
在这里插入图片描述
进入创建好的存储空间,可以先测试一下使用功能
在这里插入图片描述

项目工程准备

概述

在微服务架构中把文件相关操作功能单独做一个服务,系统中所有模块只要涉及文件的上传都走同一个服务
在这里插入图片描述
存在两种情况:1.前端直接访问文件服务,2.服务之间文件的上传,(用到feign,融合了ribbon和hystrix)

新建文件管理模块

作为父工程把src删掉,
设置打包方式:< packaging >pom< /packaging >,这样不会打成jar包,只是去维护工程中的公共坐标
在这里插入图片描述

把文件上传到OSS的三种方案

1.通过web前端直接上传到OSS服务器,这种方式意味着需要把OSS配置参数写死在JS中,有安全隐患
2.通过web前端把文件上传到后端服务器,后端服务器再把文件上传到OSS,这种方式虽然没有了暴露OSS配置参数的安全隐患,但是文件通过后端中转了一次在上传,性能不高,而且增加了服务的压力.影响不大,我们用第二种
3.OSS最佳实践:后端服务签名后前端直传,即:依然是web前端直接把文件上传到OSS服务器,只是在上传文件之前先请求后端获取OSS配置签名信息,web前端拿到签名信息后和文件一起上传到OSS服务器,这样一来,文件上传既不需要通过后台服务器中转一次,也不会有暴露OSS配置参数的风险。

通过官方文档完成demo上传

官方文档找JavaSDK

https://help.aliyun.com/document_detail/31886.html

文件上传思路

1.前端发起一个上传的请求
2.前端将上传的文件以IO流的方式,传到后台
3.后台会以MultipartFile的数据类型来接收
4.进行文件保存
使用OSS的对象存储来实现

代码

在这里插入图片描述
application.yml

server:
  port: 1050

file:
  alicloud:
    bucketName: hrm-obj-ming #上传空间bucket
    accessKey: aaaaaaaaaaaaaaaaaaaaa #key
    secretKey: sssssssssssssssssssss #秘钥
    endpoint: https://oss-cn-beijing.aliyuncs.com  #上传端点

AlicloudOSSProperties

@Data
@Component //这个注解不能省略。将这个对象的创建过程交给Spring管理。只有这样你才能在需要使用它的地方,通过@autowired进行注入
@ConfigurationProperties(prefix = "file.alicloud") //读取application.yml中自定义的属性,并设置它的前缀
public class AlicloudOSSProperties {
    private String bucketName;
    private String accessKey;
    private String secretKey;
    private String endpoint;
}

FileController

@RestController
@RequestMapping("/file")
public class FileController {

/*    @Value("${file.alicloud.buketName}")
    private String buketName;
    @Value("${file.alicloud.accessKey}")
    private String accessKey;
    @Value("${file.alicloud.secretKey}")
    private String secretKey;
    @Value("${file.alicloud.endpoint}")
    private String endpoint;*/

    @Autowired
    private AlicloudOSSProperties alicloudOSSProperties;

    @PostMapping("/upload1")
    private AjaxResult upload1(MultipartFile file,String objectPath){
        // Endpoint按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        String accessKeyId = "kkkkkkkkkkkkkkkkkkk";
        String accessKeySecret = "sssssssssssssssssssssss";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        try {
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        } catch (com.aliyuncs.exceptions.ClientException e) {
            e.printStackTrace();
        }
        // 填写Bucket名称
        String bucketName = "hrm-obj-ming";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String suffix = StringUtils.substringAfter(file.getOriginalFilename(), ".");
        String objectName = objectPath + resetFileName() + "." + suffix;
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
        String localPath = "D:/devPicture/pethome/";
        String localFileWholeName = localPath + file.getOriginalFilename();

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);

        try {
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(localFileWholeName));
            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传文件。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            System.out.println("result = " + result);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return new AjaxResult().setMessage("上传成功了");
    }

    @PostMapping("/upload2")
    public AjaxResult upload2(String objectPath,MultipartFile file) throws Exception {
/*        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = "kkkkkkkkkkkkkkkk";
        String accessKeySecret = "ssssssssssssssss";*/

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(alicloudOSSProperties.getEndpoint(), alicloudOSSProperties.getAccessKey(), alicloudOSSProperties.getSecretKey());

        // 填写Byte数组。
        byte[] content = file.getBytes();
        // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
        //注意:所有有关字符串的操作,尽量使用commons-lang3包中stringutils工具类
        //abc.png-----拿到.png
        String suffix = StringUtils.substringAfter(file.getOriginalFilename(), ".");
        String ossWholeFileName = objectPath + resetFileName() + "." + suffix;
        ossClient.putObject(alicloudOSSProperties.getBucketName(), ossWholeFileName, new ByteArrayInputStream(content));

        // 关闭OSSClient。
        ossClient.shutdown();

        return AjaxResult.me().setResultObj(ossWholeFileName);
    }

    /**
     * 生成一个唯一的文件的名称:年+月+日+随机串
     * @return
     */
    private String resetFileName() {
        //如何获取年月日
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String format = sdf.format(new Date());
        //再通过UUID得到一个随机且唯一的字符串
        String randomStr = StringUtils.replace(UUID.randomUUID().toString(), "-", "");
        return format + randomStr;
    }
}

pom.xml

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1191887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ADS错误Error警告warning记录持续更新

ADS错误Error警告warning记录持续更新 简介环境1 (smithdg.ael line 7843, column 12 in multiply) Value or parameter is NULL 简介 由于ADS的报错不是很好能找到问题源头&#xff0c;因此记录我在仿真遇到的错误与警告&#xff0c;和其解决办法。 环境 ADS2020 1 (smith…

TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息&#xff0c;明确要传输的数据格式&#xff1b; 应用层协议:这个协议&#xff0c;实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统&#xff0c;驱动&#xff0c;硬件实现好了的&#xff0c;咱们是不需要管 2)应用层:当我…

嵌入式软件开发常用工具有哪些?

分享一些嵌入式软件开发常用工具。 1、Keil MDK&#xff1a;这是德国Keil公司开发的基于8051、9051、ARM7、ARM9系列微控制器的嵌入式软件开发工具&#xff0c;它提供了包括C编译器、宏汇编、连接器、库管理器、仿真器等在内的完整开发方案。Keil还提供了丰富的中间件和库函数&…

AntDB-M高性能设计之hash索引动态rehash

AntDB-M支持hash索引、btree索引等索引类型&#xff0c;hash索引以hash表的方式实现&#xff0c;一个简单的hash表示意图如图1所示。hash桶下的元素节点为单向或者双向链表&#xff0c;数据行上某一个或者某几个字段组成索引&#xff0c;通过hash函数对索引字段的值进行运算&am…

【计网 传输层概述】 中科大郑烇老师笔记 (十)

目录 0 引言1 概述1.1 传输服务和协议1.2 传输层 vs 网络层1.3 Internet传输层协议 TCP和UDP 2 多路复用、解复用2.1 UDP的多路复用2.2 TCP的多路复用 3 UDP3.1 概述3.2 UDP报文段3.3 拓展&#xff1a;TCP报文段 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏…

浅谈安科瑞直流电表在加拿大光伏系统中的应用

摘要&#xff1a;本文介绍了安科瑞直流电表DJSF1352在加拿大光伏系统中的应用。主要用于光伏系统中的电流的计量&#xff0c;配合分流器对电流进行计量。 Abstract: This article introduces the application of Acrel DC meters in PV system in Canada.The device is measu…

css:clip元素裁剪实现Loading加载效果边框

clip 属性定义了元素的哪一部分是可见的。clip 属性只适用于 position:absolute 的元素。 警告&#xff1a; 这个属性已被废弃。建议使用 clip-path 文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/cliphttps://developer.mozilla.org/zh-CN/docs/Web/CSS/clip-path …

振南技术干货集:C语言的一些“骚操作”及其深层理解(2)

注解目录 第二章《c语言的一些“操作”及其深层理解》 一、字符串的实质就是指针 &#xff08;如何将 35 转为对应的十六进制字符串”0X23”&#xff1f;&#xff09; 二 、转义符\ &#xff08;打入字符串内部的“奸细”。&#xff09; 三、字符串常量的连接 &#xff…

2023年【公路水运工程施工企业安全生产管理人员】复审考试及公路水运工程施工企业安全生产管理人员考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 公路水运工程施工企业安全生产管理人员复审考试根据新公路水运工程施工企业安全生产管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将公路水运工程施工企业安全生产管理人员模拟考试试题进行汇编&#xff0…

asp.net学生部门管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 学生部门管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net学生部门管理系统1 应用技…

详解机器学习最优化算法

前言 对于几乎所有机器学习算法&#xff0c;无论是有监督学习、无监督学习&#xff0c;还是强化学习&#xff0c;最后一般都归结为求解最优化问题。因此&#xff0c;最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中&#xff0c;小编将对机器学习中所使用的…

Springboot通过ObjectMapper(节点树)解析JSON

1、ObjectMapper通过节点树的方式解析JSON字符串 1.1、通过节点直接获取属性值 1.1.1、测试代码 node.get("order_id")&#xff1a;直接获取JSON中属性对应的值 Test public void parseJson() throws Exception{//创建json字符串&#xff0c;模拟从外界接收的订…

2023年【危险化学品生产单位安全生产管理人员】最新解析及危险化学品生产单位安全生产管理人员理论考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员最新解析考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位安全生产管理人员理论考试题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产…

halcon分割粘连字符

下面的算子都可以分割&#xff1a; 1.*&#xff08;推荐使用这个&#xff09;在垂直范围较小的位置水平划分区域 partition_dynamic(circleRegion,parRegion,76,50)2.*将一个区域划分为大小大致相等的矩形。&#xff08;这个方法适合宽度相等&#xff0c;很规则的排列的字符串…

韩语图片文字如何转为纯文本?

如何将上图为韩语的图片转为文本文件&#xff1f;这个需要用到OCR程序&#xff0c;操作方法如下&#xff1a; 一、打开金鸣识别网站。 二、点击“点击添加图片/PDF”&#xff0c;将待识别的图片添加到列表。 三、识别模块点选“通用文字”&#xff0c;输出格式选择“纯文本输…

Python 函数定义详解(More on Defining Functions)- 默认参数/位置参数/关键字参数

1.函数的定义和调用方法 1.1函数定义方法 """def 关键字用来定义一个函数。function_name 是函数名&#xff0c;应遵循命名规范。parameter1, parameter2, ... 是函数的参数列表&#xff0c;可以是任意数量和类型的参数。函数体是用缩进&#xff08;通常为4个…

线上SQL超时场景分析-MySQL超时之间隙锁 | 京东物流技术团队

前言 之前遇到过一个由MySQL间隙锁引发线上sql执行超时的场景&#xff0c;记录一下。 背景说明 分布式事务消息表&#xff1a;业务上使用消息表的方式&#xff0c;依赖本地事务&#xff0c;实现了一套分布式事务方案 消息表名&#xff1a;mq_messages 数据量&#xff1a;3…

Facebook广告被暂停是什么原因?Facebook广告账号被封怎么办?

许多做海外广告投放的小伙伴经常遇到一个难题&#xff0c;那就是投放的Facebook广告被拒或 Facebook 广告帐户被关闭赞停的经历&#xff0c;随之而来的更可能是广告账户被封&#xff0c;导致资金的损失。本文将从我自身经验&#xff0c;为大家分享&#xff0c;Facebook广告被暂…

kafka 集群企业部署最佳实践

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Git安装配置保姆级教程和Git创建仓库的基本原理和常用命令

目录 前言 一、Git简介 1.Git 与 SVN 区别点 2.Git的介绍 3.Git 工作流程 4.Git 工作区、暂存区和版本库 二、Git安装配置 1.Linux 平台上安装 2.Windows 平台上安装 三、Git 创建仓库和下载 1、首先需要注册一个gitee账号 2.git初始化并提交到远程仓库 3.另一用户…