java——文件上传

一、文件上传——简介

  1. 文件上传的简介:文件上传是指将本地计算机中的文件传输到网络上的服务器或另一台计算机上的过程。在 Web 开发中,文件上传通常指的是将用户通过 Web 页面提交的文件(如图像、文档、音频、视频等)传输到服务器端的操作。

    • 简单来说,文件上传是指将本地图片、视频、音频等文件上传到服务器上,供其他用户浏览或下载的过程。
  2. 文件上传通常涉及以下几个主要组件:

      1. 客户端:指的是文件上传的发起方,通常是用户在 Web 浏览器中通过表单提交文件。
      1. 服务器端:指的是接收并处理文件上传请求的计算机系统或服务器。
      1. 上传表单:通过 HTML 表单元素来实现文件上传功能。表单需要设置 enctype 属性为 “multipart/form-data”,并包含一个文件输入框用于选择要上传的文件。
      1. 文件处理逻辑:服务器端接收到文件上传请求后,需要将上传的文件保存到指定的位置,并可能进行进一步的处理,如文件存储、文件重命名、文件格式验证等。
      1. 文件上传控制器:在 Web 开发框架中,通常需要编写文件上传的处理逻辑,这些逻辑通常由服务器端的控制器或处理器来处理。
  3. 文件上传在 Web 开发中非常常见,常见的应用场景包括但不限于用户头像上传、文件分享、数据备份等。

二、文件上传——入门

  1. 文件上传的步骤

      1. 先创建一个springboot工程(这个常识了,不展示了)
      1. 编写一个上传文件的前端html文件
      1. 编写一个controller
  2. 项目结构
    在这里插入图片描述

  3. 文件上传前端的三要素:

    • 请求方式是:post
    • 需要设置 enctype=“multipart/form-data” 属性以支持文件上传
    • <form> 元素应该包含一个 <input type="file"> 元素,用于让用户选择要上传的文件。
      c91c38aac443fac133d5992143e30.png)

编写的html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传</title>
</head>
<body><h2>上传文件</h2><form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file" id="fileToUpload"><input type="submit" value="上传" name="submit">
</form></body>
</html>

编写的controller

package com.knife.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;@RestController
public class UploadController {@PostMapping("/upload")public void upload(MultipartFile file){System.out.println("file == " + file);}}

运行截图:(通过xml配置的路径去访问html文件,然后点击上传文件)
file内容不等于null,说明文件上传成功。
在这里插入图片描述

在这里插入图片描述

总结:服务端要想接收到从前端页面上传的文件,需要使用到一个api:MultipartFile,通过该api来接收上传的文件。而上传上来的文件是一个临时文件,当文件上传这次请求完成之后,这些临时文件会自动删除。因此,在上传文件的同时,应该把文件保存起来。

三、文件上传——本地存储—第一版

  1. 在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。

  2. 基础实现:在上面的文件上传——入门的基础上,修改一下controller就行。

package com.knife.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@RestController
public class UploadController {@PostMapping("/upload")public void upload(MultipartFile file) throws IOException {System.out.println("file == " + file);// 获取源文件的文件名String originalFilename = file.getOriginalFilename();//        把上传上来的文件存储到磁盘上:transferTo的参数是一个文件file.transferTo(new File("E:\\images\\"+ originalFilename));}}

只需把上面的controller改成上面一样,然后运行,然后如果你的路径不对,或者你盘符的目录不存在,就会报错了(因为这里没有对异常处理,只是简单地把异常抛出去了)
在这里插入图片描述
最快的解决办法就是,修改本地存储的路径,输入一个存在的目录的路径。
在这里插入图片描述

最佳解决办法:如下更改controller

package com.knife.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
public class UploadController {@PostMapping("/upload")public void upload(MultipartFile file) throws IOException {System.out.println("file == " + file);// 1. 获取源文件的文件名String originalFilename = file.getOriginalFilename();//        定义要上传的路径String  fileUploadPath = "E:\\images\\"+ originalFilename;//       创建要上传的文件File uploadFile = new File(fileUploadPath);// 判断配置的文件目录是否存在,若不存在则创建一个新的文件目录File parentFile = uploadFile.getParentFile();if(!parentFile.exists()) {parentFile.mkdirs();}System.out.println(uploadFile);file.transferTo(uploadFile);}}

运行:

在这里插入图片描述

四、文件上传——本地存储—第二版

  1. 本地存储第一版存在的问题:

      1. 使用原始文件名进行存储时,如果同时上传了文件名一样的文件,那么后面上传的文件会把前面上传的文件给覆盖。
      • 解决:保证每一个文件的文件名是唯一的(文件名不能重复)
        • 使用uuid工具(通用唯一标识码)——使用生成的uuid码+原始文件名的后缀
  2. 不管文件路径的报错的写法(和上面文件上传——本地存储—第一版就只有controller的差别):

package com.knife.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
public class UploadController {@PostMapping("/upload")public void upload(MultipartFile file) throws IOException {System.out.println("file == " + file);// 1. 获取源文件的文件名String originalFilename = file.getOriginalFilename();// 2. 构造唯一的文件名  -- 使用uuid(通用唯一识别码,长度固定的字符串,而且是唯一的)+ 原始文件文件后缀名
//        2.1. 通过字符串的截取,获取文件的后缀名int index = originalFilename.lastIndexOf(".");String extname = originalFilename.substring(index);
//        2.2 把uuid和文件后缀名合并String newFileName = UUID.randomUUID().toString() + extname;System.out.println("newFileName = " + newFileName);
//        把上传上来的文件存储到磁盘上:(指定一个路径)file.transferTo(new File("E:\\"+ newFileName));}}
  1. 解决文件路径的报错的写法(和上面文件上传——本地存储—第一版就只有controller的差别):
package com.knife.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
public class UploadController {@PostMapping("/upload")public void upload(MultipartFile file) throws IOException {System.out.println("file == " + file);// 1. 获取源文件的文件名String originalFilename = file.getOriginalFilename();// 2. 构造唯一的文件名  -- 使用uuid(通用唯一识别码,长度固定的字符串,而且是唯一的)+ 原始文件文件后缀名
//        2.1. 通过字符串的截取,获取文件的后缀名int index = originalFilename.lastIndexOf(".");String extname = originalFilename.substring(index);
//        2.2 把uuid和文件后缀名合并String newFileName = UUID.randomUUID().toString() + extname;//        定义要上传的路径String  fileUploadPath = "E:\\images\\"+ newFileName;//       创建要上传的文件File uploadFile = new File(fileUploadPath);// 判断配置的文件目录是否存在,若不存在则创建一个新的文件目录File parentFile = uploadFile.getParentFile();if(!parentFile.exists()) {parentFile.mkdirs();}System.out.println(uploadFile);
//        把上传上来的文件存储到磁盘上:(指定一个路径)file.transferTo(uploadFile);}}

运行:
在这里插入图片描述

文件上传大小限制的问题:在配置文件里面进行配置

在这里插入图片描述
如果是application.properties则如上图一样配置就行,如果是application.yml,则如下配置即可

application.yml:

server:port: 8088   # 配置访问服务器的端口spring:servlet:multipart:max-file-size: 10MB  # 配置单个文件最大上传大小max-request-size: 100MB   # 配置单个请求最大上传文件的大小(一次可以上传多个文件,即多个文件的总和也算)
  1. 本地存储存在的问题:
    在这里插入图片描述

五、文件上传——对象存储——阿里云OOS

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、1、参照官方SDK编写入门程序

  1. 第一步:在Maven工程中使用OSS Java SDK,只需在pom.xml中加入相应依赖即可。在<dependencies>中加入如下内容(参考官方文档的说明):
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>
  • 如果使用的是Java 9及以上的版本,则需要添加JAXB相关依赖。添加JAXB相关依赖示例代码如下:
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>
  1. 第二步:复制上传文件入门代码(官方文档)官方文档入门程序例子:然后再根据自己的实际情况改写
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;public class Demo {public static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称,例如examplebucket。String bucketName = "examplebucket";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "exampledir/exampleobject.txt";// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。String filePath= "D:\\localpath\\examplefile.txt";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);try {InputStream inputStream = new FileInputStream(filePath);// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);} 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();}}}
} 

改写后的入门程序:主要修改自己的endpoint、accessKeyId、bucketName、objectName、filePath

package com.knife;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;public class uploadOss{public static void main(String[] args) throws Exception {// Endpoint:(华北2(北京))请按实际情况填写。String endpoint = "oss-cn-beijing.aliyuncs.com"; // 根据自己的实际情况填写// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
//        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
//        使用accessKeyId、accessKeyIdSecret替代。String accessKeyId = "你自己的密钥id"; // 根据自己的实际情况填写String accessKeyIdSecret ="你自己的密钥";// 根据自己的实际情况填写// 填写Bucket名称,例如examplebucket。String bucketName = "你自己的bucketName";// 根据自己的实际情况填写// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "1.jpg";  //设置我们上传的文件,最终在阿里云上面是什么名字// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。String filePath= "C:\\Users\\qq351\\Pictures\\Saved Pictures\\1.jpg";// 创建OSSClient实例。
//        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeyIdSecret);try {InputStream inputStream = new FileInputStream(filePath);// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);} 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();}}}
} 

路径获取:
在这里插入图片描述
运行就可以传进去了
在这里插入图片描述
在这里插入图片描述
通过浏览器访问该图片的路径时,会直接下载该图片,但是在页面显示出来挺简单的,就是使用一个imag标签,然后把路径放在src下即可

<image src="https://cangqiongwaimaiknife.oss-cn-beijing.aliyuncs.com/1.jpg">

六、在项目中使用OOS文件上传

  1. 在项目中,一般会把文件上传的方法封装成一个工具类然后再使用

在配置文件里面对oss的参数进行配置

#阿里云OSS
aliyun:oss:endpoint: https://oss-cn-hangzhou.aliyuncs.comaccessKeyId: LTAI4GCH1vX6DKqJWxd6nEuWaccessKeySecret: yBshYweHOpqDuhCArrVHwIiBKpyqSLbucketName: web-tlias

属性配置类:(读取配置文件里面的属性)


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;
}

封装工具类:


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;/*** 阿里云 OSS 工具类*/
@Component
public class AliOSSUtils {@Autowiredprivate AliOSSProperties aliOSSProperties;/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {//获取阿里云OSS参数String endpoint = aliOSSProperties.getEndpoint();String accessKeyId = aliOSSProperties.getAccessKeyId();String accessKeySecret = aliOSSProperties.getAccessKeySecret();String bucketName = aliOSSProperties.getBucketName();// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}}

controller类上使用

import com.itheima.pojo.Result;
import com.itheima.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
public class UploadController {@Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public Result upload(MultipartFile image) throws IOException {log.info("文件上传, 文件名: {}", image.getOriginalFilename());//调用阿里云OSS工具类进行文件上传String url = aliOSSUtils.upload(image);log.info("文件上传完成,文件访问的url: {}", url);return Result.success(url);}}

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

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

相关文章

大数据实验统计-1、Hadoop安装及使用;2、HDFS编程实践;3、HBase编程实践;4、MapReduce编程实践

大数据实验统计 1、Hadoop安装及使用&#xff1b; 一&#xff0e;实验内容 Hadoop安装使用&#xff1a; 1&#xff09;在PC机上以伪分布式模式安装Hadoop&#xff1b; 2&#xff09;访问Web界面查看Hadoop信息。 二&#xff0e;实验目的 1、熟悉Hadoop的安装流程。 2、…

【Rust】生命周期

Rust 生命周期机制是与所有权机制同等重要的资源管理机制。 之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。 引用是对待复杂类型时必不可少的机制&#xff0c;毕竟复杂类型的数据不能被处理器轻易地复制和计算。 但引用往往导致极其复杂的资源管理问题&#x…

归并排序解读

在算法领域中&#xff0c;排序算法一直是一个核心话题。归并排序&#xff08;Merge Sort&#xff09;作为一种典型的分治思想应用&#xff0c;以其稳定、高效的特点受到了广泛的关注和应用。本文将深入探讨归并排序的原理、实现方式&#xff0c;以及它在实际应用中的价值。 一…

KeyguardClockSwitch的父类

KeyguardClockSwitch 定义在KeyguardStatusView中, mClockView findViewById(R.id.keyguard_clock_container);KeyguardClockSwitch的父类为&#xff1a; Class Name: LinearLayout Class Name: KeyguardStatusView Class Name: NotificationPanelView Class Name: Notificat…

如何在iPhone上恢复永久删除的照片?

2007 年&#xff0c;Apple Inc. 推出了这款震撼人心的智能手机&#xff0c;后来被称为 iPhone。您会惊讶地发现&#xff0c;迄今为止&#xff0c;Apple Inc. 已售罄 7 亿台 iPhone 设备。根据 2023 年 8 月的一项调查数据&#xff0c;95% 的智能手机利润都落入了苹果公司的口袋…

关系型数据库与非关系型数据库、Redis数据库

相比于其他的内存/缓存数据库&#xff0c;redis可以方便的实现持久化的功能&#xff08;保存至磁盘中&#xff09; 一、关系数据库与非关系型数据库 1.1 关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型基础上一般面向于记录 SQL语句 (标准数据查询语言) 就是一种…

【攻防世界】ics-05

php://filter 伪协议查看源码 preg_replace 函数漏洞 1.获取网页源代码。多点点界面&#xff0c;发现点云平台设备维护中心时&#xff0c;页面发生变化。 /?pageindex 输入什么显示什么&#xff0c;有回显。 用php://filter读取网页源代码 ?pagephp://filter/readconvert.…

MPLS-基础、LSR、LSP、标签、体系结构

MPLS技术 MPLS基础 MPLS&#xff1a;转发数据时&#xff0c;只在网络边缘分析IP报文头&#xff0c;不在每一跳都分析&#xff0c;节约了转发时间。 MPLS&#xff1a;Multiprotocol Label Switching&#xff0c;多协议标签交换骨干网技术。主要应用&#xff1a;VPN、流量工程…

【数据库】MySQL InnoDB存储引擎详解 - 读书笔记

MySQL InnoDB存储引擎详解 - 读书笔记 InnoDB 存储引擎概述InnoDB 存储引擎的版本InnoDB 体系架构内存缓冲池LRU List、Free List 和 Flush List重做日志缓冲&#xff08;redo log buffer&#xff09;额外的内存池 存储结构表空间系统表空间独立表空间通用表空间undo表空间临时…

PyQt qrc2py 使用PowerShell将qrc文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用

前言 由于需要使用不同的qt环境&#xff08;PySide&#xff0c;PyQt&#xff09;所以写了这个脚本&#xff0c;使用找到的随便一个rcc命令去转换qrc文件&#xff0c;然后将导入模块换成qtpy这个通用库(支持pyside2-6&#xff0c;pyqt5-6)&#xff0c;老版本的是Qt.py(支持pysi…

Scaling Law解析

文章目录 scaling law一个token的计算量幂律关系幂律规律实际指导 scaling law 幂律法则&#xff1a;对大模型数据量、参数量、算力之间的最优分配 不仅仅是对语言大模型&#xff0c;对主要基于tranformer的多模态大模型基本都有效 对于Decoder-only结构模型(GPT架构)&#…

[技术闲聊]我对电路设计的理解(十)-示波器选取

电路出故障了&#xff0c;要解决问题就需要循证辩药&#xff0c;调试工具有多样&#xff0c;但对于硬件工程师来说&#xff0c;调试时的眼睛必是示波器无疑&#xff0c;波形样式、幅度、频率等都是疑难杂症散发出的信息&#xff0c;捕获流量密码&#xff0c;就能淘到金&#xf…

Ps:合并到 HDR Pro

Ps菜单&#xff1a;文件/自动/合并到 HDR Pro Automate/Merge to HDR Pro 合并到 HDR Pro Merge to HDR Pro命令可以将同一场景的具有不同曝光度的多个图像合并起来&#xff0c;从而捕获单个 HDR 图像中的全部动态范围。 合并到 HDR Pro 命令分两步进行。 首先&#xff0c;需要…

java -网络编程socket-聊天室-02

完整版代码 java -聊天室的代码: 用于存放聊天室的项目的代码和思路导图https://gitee.com/to-uphold-justice-for-others/java---code-for-chat-rooms.git 先引入线程的正统解释 线程&#xff08;Thread&#xff09;是程序执行流的最小单元。线程是操作系统分配CPU时间片的基…

【HTML】制作一个简单的三角形动态图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML和CSS代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;CSS的文件名…

Day83:服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现

目录 J2EE-组件Jackson-本地demo&CVE 代码执行 (CVE-2020-8840) 代码执行 (CVE-2020-35728&#xff09; J2EE-组件FastJson-本地demo&CVE FastJson < 1.2.24 FastJson < 1.2.47 FastJson < 1.2.80 (利用条件比较苛刻) J2EE-组件XStream-靶场&CVE …

【JAVA】postman import certificates in project 导入证书pfx

1. 打开这个按钮 2. File ->Settings 3. 打开“certificates”, Add certificates 添加证书 4. 输入证书地址&#xff0c;然后选择证书文件pfx , 输入证书密码。点击添加就可以了。 特别提醒&#xff1a; 推荐本地自己证书验证软件&#xff0c;“KeyStore” 这个软件可以…

Revit模型进入虚幻引擎UE5教程

一、背景 小伙伴们是否有Revit进入虚幻引擎交互的需求呢&#xff1f; 二、实现功能 1.Revit进入虚幻UE5,包含模型属性&#xff0c;材质等 2.实现BIM构件点选&#xff0c;高亮&#xff0c;属性展示 3.实现BIM模型分层显示&#xff0c;爆炸等效果 三、教程地址 教程&#x…

软考 系统架构设计师系列知识点之数据库基本概念(1)

所属章节&#xff1a; 第6章. 数据库设计基础知识 第1节 数据库基本概念 数据&#xff08;Data&#xff09;是描述事务的符号记录&#xff0c;它具有多种表现形式&#xff0c;可以是文字、图形、图像、声音和语言等。信息&#xff08;Information&#xff09;是现实世界事物的…

力扣---删除链表的倒数第 N 个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&#xff1a…