若依OSS如何支持本地上传,保存到服务器本地?

SysOssController改动:

    @GetMapping("/downloadByName/**")public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);String matchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);String url = antPathMatcher.extractPathWithinPattern(matchPattern, path);ossService.downloadByName(url, response);}

ISysOssService改动:

SysOssVo getByName(String name);
void downloadByName(String name, HttpServletResponse response) throws IOException;

SysOssServiceImpl 改动:

/*** 文件上传 服务层实现**/
@RequiredArgsConstructor
@Service
public class SysOssServiceImpl implements ISysOssService, OssService {private final SysOssMapper baseMapper;@Overridepublic TableDataInfo<SysOssVo> queryPageList(SysOssBo bo, PageQuery pageQuery) {LambdaQueryWrapper<SysOss> lqw = buildQueryWrapper(bo);Page<SysOssVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);List<SysOssVo> filterResult = StreamUtils.toList(result.getRecords(), this::matchingUrl);result.setRecords(filterResult);return TableDataInfo.build(result);}@Overridepublic List<SysOssVo> listByIds(Collection<Long> ossIds) {List<SysOssVo> list = new ArrayList<>();for (Long id : ossIds) {SysOssVo vo = SpringUtils.getAopProxy(this).getById(id);if (ObjectUtil.isNotNull(vo)) {list.add(this.matchingUrl(vo));}}return list;}@Overridepublic String selectUrlByIds(String ossIds) {List<String> list = new ArrayList<>();for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) {SysOssVo vo = SpringUtils.getAopProxy(this).getById(id);if (ObjectUtil.isNotNull(vo)) {list.add(this.matchingUrl(vo).getUrl());}}return String.join(StringUtils.SEPARATOR, list);}private LambdaQueryWrapper<SysOss> buildQueryWrapper(SysOssBo bo) {Map<String, Object> params = bo.getParams();LambdaQueryWrapper<SysOss> lqw = Wrappers.lambdaQuery();lqw.like(StringUtils.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName());lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName());lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix());lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl());lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy());lqw.eq(StringUtils.isNotBlank(bo.getService()), SysOss::getService, bo.getService());return lqw;}@Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId")@Overridepublic SysOssVo getById(Long ossId) {return baseMapper.selectVoById(ossId);}@Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId")@Overridepublic SysOssVo getByName(String name) {LambdaQueryWrapper<SysOss> lqw = Wrappers.lambdaQuery();lqw.eq(SysOss::getFileName, name);lqw.last("limit 1");return baseMapper.selectVoOne(lqw);}@Overridepublic void download(Long ossId, HttpServletResponse response) throws IOException {SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId);if (ObjectUtil.isNull(sysOss)) {throw new ServiceException("文件数据不存在!");}FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");OssClient storage = OssFactory.instance();try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) {int available = inputStream.available();IoUtil.copy(inputStream, response.getOutputStream(), available);response.setContentLength(available);} catch (Exception e) {throw new ServiceException(e.getMessage());}}@Overridepublic void downloadByName(String name, HttpServletResponse response) throws IOException {SysOssVo sysOss = SpringUtils.getAopProxy(this).getByName(name);if (ObjectUtil.isNull(sysOss)) {throw new ServiceException("文件数据不存在!");}FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");OssClient storage = OssFactory.instance();try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) {int available = inputStream.available();IoUtil.copy(inputStream, response.getOutputStream(), available);response.setContentLength(available);} catch (Exception e) {throw new ServiceException(e.getMessage());}}@Overridepublic SysOssVo upload(MultipartFile file) {String originalfileName = file.getOriginalFilename();String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());OssClient storage = OssFactory.instance();UploadResult uploadResult;try {uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType());} catch (IOException e) {throw new ServiceException(e.getMessage());}// 保存文件信息SysOss oss = new SysOss();oss.setUrl(uploadResult.getUrl());oss.setFileSuffix(suffix);oss.setFileName(uploadResult.getFilename());oss.setOriginalName(originalfileName);oss.setService(storage.getConfigKey());baseMapper.insert(oss);SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class);return this.matchingUrl(sysOssVo);}@Overridepublic Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {if (isValid) {// 做一些业务上的校验,判断是否需要校验}List<SysOss> list = baseMapper.selectBatchIds(ids);for (SysOss sysOss : list) {OssClient storage = OssFactory.instance(sysOss.getService());if(storage.isLocal()){storage.delete(sysOss.getFileName());}else{storage.delete(sysOss.getUrl());}}return baseMapper.deleteBatchIds(ids) > 0;}/*** 匹配Url** @param oss OSS对象* @return oss 匹配Url的OSS对象*/private SysOssVo matchingUrl(SysOssVo oss) {OssClient storage = OssFactory.instance(oss.getService());// 仅修改桶类型为 private 的URL,临时URL时长为120sif (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) {oss.setUrl(storage.getPrivateUrl(oss.getFileName(), 120));}return oss;}
}

OssClient改动:

/*** S3 存储协议 所有兼容S3协议的云厂商均支持* 阿里云 腾讯云 七牛云 minio**/
public class OssClient {private final String configKey;private final OssProperties properties;private AmazonS3 client;public OssClient(String configKey, OssProperties ossProperties) {this.configKey = configKey;this.properties = ossProperties;if(!isLocal()){try {AwsClientBuilder.EndpointConfiguration endpointConfig =new AwsClientBuilder.EndpointConfiguration(properties.getEndpoint(), properties.getRegion());AWSCredentials credentials = new BasicAWSCredentials(properties.getAccessKey(), properties.getSecretKey());AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);ClientConfiguration clientConfig = new ClientConfiguration();if (OssConstant.IS_HTTPS.equals(properties.getIsHttps())) {clientConfig.setProtocol(Protocol.HTTPS);} else {clientConfig.setProtocol(Protocol.HTTP);}AmazonS3ClientBuilder build = AmazonS3Client.builder().withEndpointConfiguration(endpointConfig).withClientConfiguration(clientConfig).withCredentials(credentialsProvider).disableChunkedEncoding();if (!StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE)) {// minio 使用https限制使用域名访问 需要此配置 站点填域名build.enablePathStyleAccess();}this.client = build.build();createBucket();} catch (Exception e) {if (e instanceof OssException) {throw e;}throw new OssException("配置错误! 请检查系统配置:[" + e.getMessage() + "]");}}}public void createBucket() {try {String bucketName = properties.getBucketName();if (client.doesBucketExistV2(bucketName)) {return;}CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);AccessPolicyType accessPolicy = getAccessPolicy();createBucketRequest.setCannedAcl(accessPolicy.getAcl());client.createBucket(createBucketRequest);client.setBucketPolicy(bucketName, getPolicy(bucketName, accessPolicy.getPolicyType()));} catch (Exception e) {throw new OssException("创建Bucket失败, 请核对配置信息:[" + e.getMessage() + "]");}}public UploadResult upload(byte[] data, String path, String contentType) {return upload(new ByteArrayInputStream(data), path, contentType);}public boolean isLocal(){return configKey.startsWith(OssConstant.localKey);}private String getLocalFullPath(String path){return properties.getBucketName() + path;}public UploadResult upload(InputStream inputStream, String path, String contentType) {if (!(inputStream instanceof ByteArrayInputStream)) {inputStream = new ByteArrayInputStream(IoUtil.readBytes(inputStream));}if(isLocal()){//保存到本地文件File file = new File(getLocalFullPath(path));if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}try {file.delete();Files.write(file.toPath(), IoUtil.readBytes(inputStream), StandardOpenOption.CREATE);}catch (Exception e) {throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]");}return UploadResult.builder().url(getUrl() + "/" + path).filename(path).build();}try {ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType(contentType);metadata.setContentLength(inputStream.available());// 上传文件时就需要告诉阿里云OSS - 开启图片客户端缓存if (FileUtils.isImageFile(path)) {// 最大缓存7天metadata.setCacheControl("public, max-age=604800");}PutObjectRequest putObjectRequest = new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata);// 设置上传对象的 Acl 为公共读putObjectRequest.setCannedAcl(getAccessPolicy().getAcl());client.putObject(putObjectRequest);} catch (Exception e) {throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]");}return UploadResult.builder().url(getUrl() + "/" + path).filename(path).build();}public void delete(String path) {if(isLocal()){new File(getLocalFullPath(path)).delete();return;}path = path.replace(getUrl() + "/", "");try {client.deleteObject(properties.getBucketName(), path);} catch (Exception e) {throw new OssException("删除文件失败,请检查配置信息:[" + e.getMessage() + "]");}}public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) {return upload(data, getPath(properties.getPrefix(), suffix), contentType);}public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) {return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType);}/*** 获取文件元数据** @param path 完整文件路径*/public ObjectMetadata getObjectMetadata(String path) {path = path.replace(getUrl() + "/", "");S3Object object = client.getObject(properties.getBucketName(), path);return object.getObjectMetadata();}public InputStream getObjectContent(String path) throws IOException {path = path.replace(getUrl() + "/", "");if(isLocal()){byte[] bytes = Files.readAllBytes(new File(getLocalFullPath(path)).toPath());return new ByteArrayInputStream(bytes);}S3Object object = client.getObject(properties.getBucketName(), path);return object.getObjectContent();}public String getUrl() {String domain = properties.getDomain();String endpoint = properties.getEndpoint();String header = OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? "https://" : "http://";if(isLocal()){return header + properties.getEndpoint();}// 云服务商直接返回if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)) {if (StringUtils.isNotBlank(domain)) {return header + domain;}return header + properties.getBucketName() + "." + endpoint;}// minio 单独处理if (StringUtils.isNotBlank(domain)) {return header + domain + "/" + properties.getBucketName();}return header + endpoint + "/" + properties.getBucketName();}public String getPath(String prefix, String suffix) {// 生成uuidString uuid = IdUtil.fastSimpleUUID();// 文件路径String path = DateUtils.datePath() + "/" + uuid;if (StringUtils.isNotBlank(prefix)) {path = prefix + "/" + path;}return path + suffix;}public String getConfigKey() {return configKey;}/*** 获取私有URL链接** @param objectKey 对象KEY* @param second    授权时间*/public String getPrivateUrl(String objectKey, Integer second) {GeneratePresignedUrlRequest generatePresignedUrlRequest =new GeneratePresignedUrlRequest(properties.getBucketName(), objectKey).withMethod(HttpMethod.GET).withExpiration(new Date(System.currentTimeMillis() + 1000L * second));URL url = client.generatePresignedUrl(generatePresignedUrlRequest);return url.toString();}/*** 检查配置是否相同*/public boolean checkPropertiesSame(OssProperties properties) {return this.properties.equals(properties);}/*** 获取当前桶权限类型** @return 当前桶权限类型code*/public AccessPolicyType getAccessPolicy() {return AccessPolicyType.getByType(properties.getAccessPolicy());}private static String getPolicy(String bucketName, PolicyType policyType) {StringBuilder builder = new StringBuilder();builder.append("{\n\"Statement\": [\n{\n\"Action\": [\n");builder.append(switch (policyType) {case WRITE -> "\"s3:GetBucketLocation\",\n\"s3:ListBucketMultipartUploads\"\n";case READ_WRITE -> "\"s3:GetBucketLocation\",\n\"s3:ListBucket\",\n\"s3:ListBucketMultipartUploads\"\n";default -> "\"s3:GetBucketLocation\"\n";});builder.append("],\n\"Effect\": \"Allow\",\n\"Principal\": \"*\",\n\"Resource\": \"arn:aws:s3:::");builder.append(bucketName);builder.append("\"\n},\n");if (policyType == PolicyType.READ) {builder.append("{\n\"Action\": [\n\"s3:ListBucket\"\n],\n\"Effect\": \"Deny\",\n\"Principal\": \"*\",\n\"Resource\": \"arn:aws:s3:::");builder.append(bucketName);builder.append("\"\n},\n");}builder.append("{\n\"Action\": ");builder.append(switch (policyType) {case WRITE -> "[\n\"s3:AbortMultipartUpload\",\n\"s3:DeleteObject\",\n\"s3:ListMultipartUploadParts\",\n\"s3:PutObject\"\n],\n";case READ_WRITE -> "[\n\"s3:AbortMultipartUpload\",\n\"s3:DeleteObject\",\n\"s3:GetObject\",\n\"s3:ListMultipartUploadParts\",\n\"s3:PutObject\"\n],\n";default -> "\"s3:GetObject\",\n";});builder.append("\"Effect\": \"Allow\",\n\"Principal\": \"*\",\n\"Resource\": \"arn:aws:s3:::");builder.append(bucketName);builder.append("/*\"\n}\n],\n\"Version\": \"2012-10-17\"\n}\n");return builder.toString();}}

windows配置:

INSERT INTO `sys_oss_config` (`oss_config_id`, `tenant_id`, `config_key`, `access_key`, `secret_key`, `bucket_name`, `prefix`, `endpoint`, `domain`, `is_https`, `region`, `access_policy`, `status`, `ext1`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (4, '000000', 'local', 'local', 'local', 'D:/local/open/data/attachment/', '', '127.0.0.1:8080/system/oss/downloadByName', '', 'N', '', '1', '0', '', 100, 1, '2023-04-11 14:04:17', 1, '2024-04-15 20:26:39', '本地文件上传不使用OSS');

linux配置:
记得修改your.domain:8080为你自己服务器的接口ip或域名和端口。

INSERT INTO `sys_oss_config` (`oss_config_id`, `tenant_id`, `config_key`, `access_key`, `secret_key`, `bucket_name`, `prefix`, `endpoint`, `domain`, `is_https`, `region`, `access_policy`, `status`, `ext1`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (4, '000000', 'local', 'local', 'local', '/usr/local/open/data/attachment/', '', 'your.domain:8080/system/oss/downloadByName', '', 'N', '', '1', '0', '', 100, 1, '2023-04-11 14:04:17', 1, '2024-04-15 20:26:39', '本地文件上传不使用OSS');

数据示例:

INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `file_suffix`, `url`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `service`) VALUES (1779849863892889601, '000000', '2024/04/15/aa0a0fc70df546d18fc824cca7eabfed.exe', 'VINFAST Setup 1.0.0.exe', '.exe', 'http://127.0.0.1:8080/system/oss/downloadByName/2024/04/15/aa0a0fc70df546d18fc824cca7eabfed.exe', 100, '2024-04-15 20:30:50', 1, '2024-04-15 20:30:50', 1, 'local');

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

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

相关文章

IO基础-传统I/O模型

关于IO数据流有两种形式&#xff0c;来源于网络和磁盘分别叫做网络IO、磁盘IO。 客户端通过TCP和UDP协议将数据流发往服务端&#xff0c;服务端接收数据这个过程称为网络IO。 服务端读取本地文件数据到服务中的过程称为磁盘IO。 基于 Linux 一切皆文件的理念&#xff0c;在内…

[大模型]Qwen-7B-Chat WebDemo

Qwen-7B-Chat WebDemo 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行demo…

AI大模型日报#0419:全球最强开源大模型 Llama 3 发布:15T 数据预训练,参数将超 4000 亿

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 刚刚&#xff0c;全球最强开源大模型 Llama 3 发布&#xff1a;使用 15T 数据预训练&#xff0c;最大模型参数将超 4000 亿 摘要…

【目标跟踪】ByteTrack详解与代码细节

文章目录 一、前言二、代码详解2.1、新起航迹2.2、预测2.3、匹配2.4、结果发布2.5、总结 三、流程图四、部署 一、前言 论文地址&#xff1a;https://arxiv.org/pdf/2110.06864.pdf git地址&#xff1a;https://github.com/ifzhang/ByteTrack ByteTrack 在是在 2021 年 10 月…

书生浦语训练营第2期-第4节笔记

一、为什么要微调&#xff1f; 1. 适应特定任务或领域&#xff1a;虽然预训练的模型通常具有广泛的知识和理解能力&#xff0c;但它们可能不完全适应特定任务的需求。通过在特定的数据集上微调模型&#xff0c;可以使模型更好地理解和处理与特定任务或领域相关的数据。 2. 提高…

【uniapp】微信小程序2024手机号快速验证及无感登录教程(内附代码)

组件&#xff1a;手机号快速验证组件 适用对象&#xff1a;企业/个体 费用&#xff1a;0.03元/次 目录 前言思路前端后端代码无感登录onload事件无感登录方法登录判断后端mini_login2 最后 前言 最近注册了公司&#xff0c;可以注册具有支付能力的小程序了&#xff0c;各种材料…

在Nuxt.js中添加PostCSS自动前缀器

在其他浏览器中&#xff0c;有些 CSS 属性需要带有前缀。如-webkit- | -o- | -ms- 等等 Autoprefixer 是一个 PostCSS 插件&#xff0c;可以将你的CSS代码渲染到浏览器中自动补充厂商前缀&#xff0c;因此你不用担心自己编写的CSS代码有浏览器兼容性问题。 如&#xff1a; .fl…

kaggle咖啡销售分析案例侧重可视化折线图条形图扇形图柱状图

目录 概述 环境依赖 数据描述 代码概述 导包 数据读取 统计缺失值 数据结构概述 描述统计 时间轴数据转换 月交易统计直方图 周交易统计图 小时数据转换 小时折线图 销售关系可视化统计 销售占比扇形图 价格箱线图 各类别多维度条形图统计 商店位置交易量折线…

重磅福利!参与现金红包抽奖活动,赶快行动吧!

文章目录 粉丝福利 粉丝福利 亲爱的朋友们&#xff0c;令人振奋的消息来啦&#xff01;本月&#xff0c;我们特地为大家准备了一份特别的粉丝福利&#xff01;只要您轻轻一点&#xff0c;关注我们的公众号&#xff0c;就有机会抽取现金红包&#xff0c;让您的生活多一份惊喜与喜…

【微信公众平台】扫码登陆

文章目录 前置准备测试号接口配置 带参数二维码登陆获取access token获取Ticket拼装二维码Url编写接口返回二维码接收扫描带参数二维码事件编写登陆轮训接口测试页面 网页授权二维码登陆生成ticket生成授权地址获取QR码静态文件支持编写获取QR码的接口 接收重定向参数轮训登陆接…

游泳耳机哪个牌子好?体验与口碑兼顾的4大游泳耳机汇总!

最近的天气越来越炎热了&#xff0c;许多人选择游泳作为一种既能锻炼身体又能享受清凉的活动。而随着科技的发展&#xff0c;越来越多的运动爱好者希望在游泳时也能享受到音乐的乐趣。因此&#xff0c;游泳耳机应运而生&#xff0c;成为市场上的热门产品。然而&#xff0c;面对…

使用PixVerse使用指定的角色生成视频

PixVerse 是一款可以将文字描述转换为高清视频的AI视频生成工具&#xff0c;它还支持直接生成原神角色的专属动画视频。以下是如何使用PixVerse使用指定的角色生成视频的步骤&#xff1a; 1. 点击PixVerse 网址 访问以下网址&#xff1a;https://app.pixverse.ai/create/vide…

jvm中的垃圾回收器

Jvm中的垃圾回收器 在jvm中&#xff0c;实现了多种垃圾收集器&#xff0c; 包括&#xff1a; 1.串行垃圾收集器 2.并行垃圾收集器 3.CMS&#xff08;并发&#xff09;垃圾收集器 4.G1垃圾收集器 1.串行垃圾回收器 效率低&#xff0c;使用较少 2.并行垃圾回收器 3.并发垃圾回…

软件估算的方法、过程、内容解读(估算指南)

4 估算方法 4.1 基于经验的方法 4.1.1 头脑风暴法 4.1.2 Delphi方法 4.1.2.1 过程图 4.1.2.2 组建评估组 4.1.2.3 系统介绍 4.1.2.4 系统分解与假设 4.1.2.5 设定偏差值 4.1.2.6 个人估计 4.1.2.7 估计结果汇总 4.1.2.8 估计差异讨论 4.1.2.9 结束 4.2 分解的方法…

Brainpan(VulnHub)

Brainpan 1、nmap 2、web渗透 随便看看 目录爆破 使用不同工具&#xff0c;不同字典进行爆破 9999端口分析 10000端口分析 字符串信息中&#xff0c;提示这个程序不能运行在DOS模式下&#xff0c;然后有32个A&#xff0c;还有一行关于复制字节到缓冲区的信息&#xff0c;还有一…

谈谈前端CSS盒模型

前言&#xff1a; 什么是CSS盒模型&#xff1f;盒模型的构造&#xff1f; 在前端开发中&#xff0c;CSS 盒模型是一种非常基础且核心的概念&#xff0c;它描述了文档中的每个元素被框架处理的方式。 ---- 打开浏览器开发者工具&#xff0c;查看Elements右侧下的Styles底部。 …

libVLC Ubuntu编译详解

1.简介 有时候&#xff0c;windows上开发不满足项目需求&#xff0c;需要移植到linux上&#xff0c;不得不自行编译libvlc&#xff0c;编译libvlc相对而言稍微麻烦一点。 我使用的操作系统&#xff1a;Ubuntu20.04 查看系统命令lsb_release -a libvlc版本&#xff1a; 3.0.1…

elment-plus 中 table 左对齐

elment-plus 中 table 左对齐 <el-tablev-loading"loading"class"flex-1 !h-auto":data"roleList":header-cell-style"{text-align: left }":row-style"{ height: 55px }":cell-style"{ text-align: left }"&…

Argus DBM 一款开源的数据库监控工具,无需部署Agent

开箱即用 无需部署Agent&#xff0c;开箱即用。我们使用JDBC直连您的数据库&#xff0c;输入IP端口账户密码即可。 全平台支持 Argus目前支持对Mysql, PostgreSQL, Oracle等数据库类型的监控&#xff0c;我们也会尽快适配其它数据库&#xff0c;致力于监控所有数据库。我们提…

AES 加解密(包含JS、VUE、JAVA、MySQL)工具方法

介绍 AES 是 Advanced Encryption Standard 的缩写&#xff0c;是最常见的对称加密算法。AES 在密码学中又称 Rijndael 加密法&#xff0c;是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES&#xff0c;已经被多方分析且广为全世界所使用。 基本原理&#…