Java中实现文件上传
目录
1、文件上传本地
1.1 原理
1.2 如何使用文件上传
1.2.1 引入文件上传的依赖
1.2.2 配置文件上传拦截器
1.2.3 完成文件上传的代码
2、文件上传oss服务器
2.1 为什么需要上传到oss服务器
2.2 如何使用oss
2.2.1 开启oss服务
2.2.2 在Java中引入依赖
2.2.3 查看自己ID和密钥
2.2.4 代码
3、案例
3.1 引入相关依赖
3.2 创建实体类
3.3 创建controller层
3.3.1 创建StudentController
3.3.2 创建UploadController
3.4 创建dao层
3.4.1 BaseDao
3.4.2 StudentDao
3.5 配置SpringMvc配置文件
3.6 编写upload.jsp文件
1、文件上传本地
1.1 原理
1.2 如何使用文件上传
1.2.1 引入文件上传的依赖
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><!--servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!--jackson依赖:把controller层方法返回的java对象转化为json字符串--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency><!--文件上传依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency></dependencies>
1.2.2 配置文件上传拦截器
<!--文件上传解析器 id:必须为multipartResolver--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置文件上传的大小 单位为byte字节 1M=1024kb=1024b 10*1024*1024--><property name="maxUploadSize" value="10485760"/><!--设置编码--><property name="defaultEncoding" value="utf-8"/></bean>
1.2.3 完成文件上传的代码
<%--表单: 提交方式必须为post enctype编码:multipart/form-data文件编码--%><form method="post" action="/upload" enctype="multipart/form-data"><%--input必须设置文件文件框 而且必须起名称--%>选择上传的文件:<input type="file" name="myfile"/><br><input type="submit" value="上传"/></form>
@Controller
public class UploadController {/**** @param myfile 接受你上传的文件对象信息封装到该类。该类中可以获取上传文件的信息。比如:文件名 文件大小 文件后缀等* 这个名称必须为文件上传表单的文件框的名称一致* @return*/@PostMapping("/upload")public String upload(MultipartFile myfile, HttpServletRequest request) throws IOException {//获取tomcat上下文中的指定目录的路径String realPath = request.getSession().getServletContext().getRealPath("/upload");//根据上面的路径创建一个文件对象File file=new File(realPath);//如果没有该目录则创建if (!file.exists()) {file.mkdirs();}//把上传的文件转移到upload目录下--重名覆盖了String uuid = UUID.randomUUID().toString().replace("-", "");File target=new File(realPath+"/"+(uuid+myfile.getOriginalFilename()));myfile.transferTo(target);return "success";}
}
2、文件上传oss服务器
2.1 为什么需要上传到oss服务器
如果项目搭建了集群。那么导致文件数据无法共享。
如果项目的target删除了。导致文件数据丢失。
2.2 如何使用oss
2.2.1 开启oss服务
oss服务器网址
点击上面链接,跳转到阿里云的oss服务器页面,完成登录后,会进入oss管理控制台,如图所示
然后点击创建Bucket,操作如下图
2.2.2 在Java中引入依赖
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>
2.2.3 查看自己ID和密钥
2.2.4 代码
@PostMapping("/upload2")public String upload2(MultipartFile myfile){// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "oss-cn-beijing.aliyuncs.com";// 填写Bucket名称,例如examplebucket。String bucketName = "XXXXX";//上传到oss后的名字String objectName = UUID.randomUUID().toString().replace("-","")+myfile.getOriginalFilename();// 创建OSSClient实例。/*** String endpoint,自己的endpoint* String accessKeyId, 自己的id* String secretAccessKey自己的密钥*/String accessKeyId="XXXXXXX";String secretAccessKey="XXXXXXX";OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,secretAccessKey);try {InputStream inputStream = myfile.getInputStream();// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);} catch (Exception oe) {}finally {if (ossClient != null) {ossClient.shutdown();}}return "success";}
3、案例
springmvc+jdbc+elementui+vue
添加和展示所有的功能
3.1 引入相关依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ykq</groupId><artifactId>qy174-springmvc04</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><!--servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!--jackson依赖:把controller层方法返回的java对象转化为json字符串--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency><!--文件上传依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><!--oss的依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency><!--mysql的jar--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency></dependencies>
</project>
3.2 创建实体类
@Data
public class Student implements Serializable {private Integer id;private String name;private String phone;private String email;private Integer age;private Byte gender;private Date createtime;private String head;}
3.3 创建controller层
3.3.1 创建StudentController
@Controller
@RequestMapping("/student")
public class StudentController {private StudentDao studentDao=new StudentDao();@GetMapping("/list")@ResponseBody //把java对象转化为json字符串public List<Student> list(){List<Student> list = studentDao.findAll();return list;}@PostMapping("/add")@ResponseBody //把java对象转化为json字符串public int add(@RequestBody Student student){int add = studentDao.add(student.getName(), student.getPhone(), student.getEmail(), student.getAge(), student.getGender(), student.getHead());return add;}
}
3.3.2 创建UploadController
@Controller
public class UploadController {/**** @param myfile 接受你上传的文件对象信息封装到该类。该类中可以获取上传文件的信息。比如:文件名 文件大小 文件后缀等* 这个名称必须为文件上传表单的文件框的名称一致* @return*/@PostMapping("/upload")public String upload(MultipartFile myfile, HttpServletRequest request) throws IOException {//获取tomcat上下文中的指定目录的路径String realPath = request.getSession().getServletContext().getRealPath("/upload");//根据上面的路径创建一个文件对象File file=new File(realPath);//如果没有该目录则创建if (!file.exists()) {file.mkdirs();}//把上传的文件转移到upload目录下--重名覆盖了String uuid = UUID.randomUUID().toString().replace("-", "");File target=new File(realPath+"/"+(uuid+myfile.getOriginalFilename()));myfile.transferTo(target);return "success";}@PostMapping("/upload2")@ResponseBodypublic String upload2(MultipartFile file){// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "oss-cn-beijing.aliyuncs.com";// 填写Bucket名称,例如examplebucket。String bucketName = "qy174-8888";//上传到oss后的名字String objectName = UUID.randomUUID().toString().replace("-","")+file.getOriginalFilename();// 创建OSSClient实例。/*** String endpoint,自己的endpoint* String accessKeyId, 自己的id* String secretAccessKey自己的密钥* XX* XXX*/String accessKeyId="XXX";String secretAccessKey="XXX";OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,secretAccessKey);try {InputStream inputStream = file.getInputStream();// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);String path="https://"+bucketName+"."+endpoint+"/"+objectName;return path;} catch (Exception oe) {}finally {if (ossClient != null) {ossClient.shutdown();}}return "失败";}
}
3.4 创建dao层
3.4.1 BaseDao
public class BaseDao {protected Connection conn;protected PreparedStatement ps;protected ResultSet rs;//数据源对象private static DataSource dataSource;//静态代码块中static {try {//创建一个属性对象Properties properties = new Properties();//加载属性文件InputStream inputStream = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");properties.load(inputStream);//获取连接池对象dataSource = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//获取连接对象public void getConn() throws Exception{conn = dataSource.getConnection();}//关闭资源public void closeAll(){if(rs!=null){try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}//通用的增删改方法public int edit(String sql,Object...params){try {getConn();ps=conn.prepareStatement(sql);//为占位符赋值for(int i=0;i<params.length;i++){ps.setObject(i+1,params[i]);}int row = ps.executeUpdate();return row;} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return 0;}}
/**1. 四个属性: connection preparedStatement ResultSet DataSource2. 静态代码块:[获取连接池]3. 获取连接对象的方法4. 关闭资源方法5. 通用的增删改方法*/
3.4.2 StudentDao
public class StudentDao extends BaseDao {//求总条数 select count(*) from t_studentpublic int getCount(){try {getConn();String sql="select count(*) as c from t_student";ps=conn.prepareStatement(sql);rs=ps.executeQuery();while (rs.next()){int c = rs.getInt("c");return c;}} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return 0;}//查询所有学员信息--单元测试public List<Student> findAll(){List<Student> list=new ArrayList<Student>();try {getConn();String sql="select * from t_student";ps=conn.prepareStatement(sql);rs=ps.executeQuery();while (rs.next()){Student s=new Student();s.setId(rs.getInt("id"));s.setPhone(rs.getString("phone"));s.setEmail(rs.getString("email"));s.setAge(rs.getInt("age"));s.setName(rs.getString("name"));s.setCreatetime(rs.getDate("createtime"));s.setGender(rs.getByte("gender"));s.setHead(rs.getString("head"));list.add(s);}} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return list;}//根据id查询学员信息public Student findById(String id){Student s=null;try {getConn();String sql="select * from t_student where id=?";ps=conn.prepareStatement(sql);ps.setObject(1,id);rs=ps.executeQuery();while (rs.next()){s=new Student();s.setId(rs.getInt("id"));s.setPhone(rs.getString("phone"));s.setEmail(rs.getString("email"));s.setAge(rs.getInt("age"));s.setName(rs.getString("name"));s.setCreatetime(rs.getDate("createtime"));s.setGender(rs.getByte("gender"));s.setHead(rs.getString("head"));}} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return s;}//添加方法public int add(String name,String phone,String email,int age,int gender,String head){String sql="insert into t_student(id,name,phone,email,age,createtime,gender,head) values(null,?,?,?,?,now(),?,?)";return edit(sql,name,phone,email,age,gender,head);}//修改public int update(String id,String name,String phone,String email,int age,int gender){String sql="update t_student set name=?,phone=?,email=?,age=?,gender=?,createtime=now() where id=?";return edit(sql,name,phone,email,age,gender,id);}//删除方法public int delete(String id){String sql="delete from t_student where id=?";return edit(sql,id);}
3.5 配置SpringMvc配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--com.ykq 扫描该包以及该包下的子包--><context:component-scan base-package="com.Hs"/><!--开启注解驱动 不要导错mvc 默认使用的不是注解模式--><mvc:annotation-driven/><!--放行静态资源--><mvc:default-servlet-handler/><!--视图解析--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/views/"/><property name="suffix" value=".jsp"/></bean><!--文件上传解析器 id:必须为multipartResolver--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置文件上传的大小 单位为byte字节 1M=1024kb=1024b 10*1024*1024--><property name="maxUploadSize" value="10485760"/><!--设置编码--><property name="defaultEncoding" value="utf-8"/></bean></beans>
3.6 编写upload.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%--表单: 提交方式必须为post enctype编码:multipart/form-data文件编码--%><form method="post" action="/upload2" enctype="multipart/form-data"><%--input必须设置文件文件框 而且必须起名称--%>选择上传的文件:<input type="file" name="myfile"/><br><input type="submit" value="上传"/></form>
</body>
</html>
相关文章:

Java中实现文件上传
目录 1、文件上传本地 1.1 原理 1.2 如何使用文件上传 1.2.1 引入文件上传的依赖 1.2.2 配置文件上传拦截器 1.2.3 完成文件上传的代码 2、文件上传oss服务器 2.1 为什么需要上传到oss服务器 2.2 如何使用oss 2.2.1 开启oss服务 2.2.2 在Java中引入依赖 2.2.3 查看自…...

一种别样的Unicode Python编码方式,完美转换表情和阿拉伯语
我们可能有时候在处理字符时需要处理到非ASCII的字符,比如将表情、阿拉伯语转换为Unicode字符,从而避免在传输时会出现乱码的情况。 Unicode验证网站: unicode转换网站 目的:转换下面除ASCII字符外的字符为Unicode字符…...
小白的晋升之路
编程小白如何成为大神?大学新生的最佳入门攻略 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱&…...

WebLogic:CVE-2017-10271[XML反序列化]
漏洞成因 Weblogic的WLS Security组件对外提供 webservice服务 其中使用了XMLDecoder来 解析用户传入的XML数据 在解析的过程中出现 反序列化漏洞 ,导致可执行任意命令 原理:https://xz.aliyun.com/t/10172 靶场部署 1.进入靶场目录 cd /vulhub-maste…...
Day13--JavaWeb学习之Servlet后端渲染界面
基于Day12中登录页面实现的修改,这里实现的是如果登录成功,跳到LoginSuccess页面中展示后端查询到数据库中的信息,并实现在浏览器实现插入数据和删除数据(mybaits)。 当输入账号密码正确后进入LoginSuccess页面&#x…...

【MySQL】全面剖析索引失效、回表查询与索引下推
1.索引失效的情况 以tb_user表举例,id为主键索引、name和phone字段上建立了一个普通索引,name和phone均为varchar类型。 索引列运算 当在 WHERE 子句或 JOIN 子句中对列使用函数或表达式时,索引会失效。 执行以下语句,可以发现执…...

1、爬⾍概述
1. 什么是爬虫? 爬虫(Web Crawler)是一种通过编写程序自动访问并提取互联网上数据的技术。爬虫可以帮助我们在浏览网页时自动收集和保存一些有用的数据,例如图片、视频和文本信息。简单来说,爬虫就是自动化的浏览器。…...

科普文:微服务之分布式链路追踪SkyWalking单点服务搭建
1. 概述 1.1 概念 SkyWalking 是什么? SkyWalking 极简入门 | Apache SkyWalking FROM Apache SkyWalking 分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。 提供分布式追…...

R 语言学习教程,从入门到精通,R的安装与环境的配置(3)
1、R 基础语法 一门新的语言学习一般是从输出 “Hello, World!” 程序开始,R 语言的 “Hello, World!” 程序代码如下: myString <- "Hello, World!" print ( myString )以上示例将字符串 “Hello, World!” 赋值给 myString 变量&#x…...

【Pageadmin】之cms漏洞
方法一:上传模块拿webshell 首页如下 第一步:访问admin/login,登录后台 第二步:使用哥斯拉工具生成payload 然后自动生成了一个asp的payload 第三步:上传文件 将asp文件压缩为压缩包,上传。 解压访问1.asp…...

AIGC重塑设施农业:让农事操作更智能,生产效率更高
设施农业是现代农业的重要组成部分,随着人工智能等前沿技术的快速发展,这个领域迎来了新的变革机遇。尤其是大语言模型(Large Language Model,LLM)技术的崛起,其强大的语言理解和知识汇聚能力,为设施农业智能化发展带来了新的想象空间。本文将深入探讨大模型技术在设施农业生产…...
netty应用-手写RPC
文章目录 手写RPC之案例定位与通信过程介绍RPC框架案例定位服务端与客户端架构通信过程1. 服务注册与发现2. 请求序列化与传输3. 请求处理与响应4. 响应反序列化与结果处理实现细节1. 服务端2. 客户端技术选型关键挑战总结手写RPC之请求响应通信协议定制协议结构示例消息头格式…...

私域流量变迁与精细移动化趋势下的AI智能名片小程序源码应用探索
摘要:随着移动互联网技术的飞速发展,私域流量的价值日益凸显,成为企业营销战略的重要组成部分。私域流量的精细化和移动化趋势不仅改变了传统的营销格局,也为新兴技术的应用提供了广阔空间。本文深入探讨了私域流量的变迁历程&…...

数据结构初阶之排序(下)
前言 上一期内容中我们了解了基本排序中的插入与选择排序,今天我将为大家带来剩下的几种排序算法 快速排序 快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素序列中的某元素作为基准值,…...

RGB图像的读取与保存
目录 1、安装imageio 2、读取照片 3、保存照片 4、resize 5、示例代码 1、安装imageio pip install imageio -i https://pypi.tuna.tsinghua.edu.cn/simple 2、读取照片 import imageio img imageio.imread(image_path) 3、保存照片 import imageio import numpy as…...
江协科技51单片机学习- p35 AD/DA模拟/数字采样
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...

C#裁剪图像的几种方法总结
前言 我们在上位机软件开发过程中经常需要裁剪图像,本文就是对c#中常见的裁剪图像方法进行总结。 1、克隆 直接调用Bitmap的Clone函数,然后指定需要裁剪的区域即可裁剪图像,该种方法不会损失精度 public static Bitmap CropImage_Clone(Bi…...

被遗忘的哑终端 —— 键盘键位演变的启发者
注:机翻,未校对。 The Forgotten World of Dumb Terminals 被遗忘的哑终端世界 A quick journey through the lost age of “glass teletypes.” 快速穿越失落的“玻璃电传打字机”时代。 From the earliest days of digital computers, researchers o…...

APACHE安装与应用
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

预警器件控制思考
预警器件控制思考 最小示例思想 当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。 最简单的就是, 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件. 如果在一段时间内, 一直是环境异常, 我…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...