JAVA如何实现跨平台大文件上传的示例代码?

大文件传输系统解决方案

作为内蒙古IT行业软件公司项目负责人,针对公司产品部门的文件传输需求,我提出以下专业解决方案:


需求分析与技术挑战

  1. 超大文件传输:单文件100G,需考虑内存管理、网络稳定性
  2. 文件夹结构保留:现有开源方案大多不成熟
  3. 高稳定性断点续传:需持久化进度信息至数据库
  4. 加密要求:支持SM4/AES,传输与存储加密
  5. 兼容性要求:跨平台、多浏览器(含IE8)、多框架支持
  6. 性能要求:避免打包下载导致的服务器崩溃

一、方案核心优势(金融级稳定+全场景适配)

1. 功能全覆盖

  • 大文件传输:单文件100G+,文件夹层级结构保留(递归遍历+元数据存储)
  • 断点续传:基于localStorage+Redis双缓存(支持IE8/刷新/关闭后恢复)
  • 国密加密:传输层HTTPS+存储层SM4/AES-256(符合GM/T 0028-2014标准)
  • 信创兼容:支持统信UOS/麒麟OS/Linux/CentOS/Ubuntu,兼容龙芯/红莲花/奇安信浏览器
  • 多数据库适配:动态配置MySQL/SQL Server/Oracle/达梦/人大金仓(通过Spring动态数据源实现)

2. 稳定性保障

  • 分片上传:1G/片分片(可配置),失败自动重试(3次/片)
  • 状态持久化:Redis存储上传进度(TTL 7天),支持分布式部署
  • 流量控制:令牌桶算法限流(防DDOS),单节点QPS≥500

3. 成本优化

  • 源码买断:98万一次性采购(公司200+项目复用,年均成本降至4.9万/项目)
  • 统一维护:提供组件升级包(季度迭代),减少各项目重复开发
  • 信创适配:已通过达梦/人大金仓兼容认证,支持国产化替代

二、前端实现(Vue2/Vue3/React/JSP兼容版)

1. 技术选型

  • 核心库vue-uploader(兼容Vue2/Vue3)+spark-md5(文件哈希计算)
  • 断点续传:基于localStorage+Redis双缓存(兼容IE8)
  • 文件夹上传:递归遍历文件夹(webkitdirectory属性),生成层级元数据

2. 核心代码(Vue2示例)

import SparkMD5 from 'spark-md5'; import { uploadChunk, checkResume, mergeChunks } from '@/api/fileUpload'; export default { data() { return { fileList: [], uploading: false, progress: 0, status: '', chunkSize: 1024 * 1024 * 1024, // 1G/片(可配置) redisClient: null // 连接Redis(用于断点续传) }; }, mounted() { // 初始化Redis连接(生产环境通过配置中心获取) this.redisClient = new Redis({ host: 'your-redis-host', port: 6379, password: 'your-redis-password' }); }, methods: { async selectFile() { const input = document.createElement('input'); input.type = 'file'; input.webkitdirectory = true; // 支持文件夹上传(Chrome/Firefox) input.multiple = true; input.addEventListener('change', async (e) => { const files = Array.from(e.target.files); this.fileList = files.map(file => ({ name: file.name, size: file.size, status: 'pending', hash: await this.calculateFileHash(file) })); this.startUpload(); }); input.click(); }, // 计算文件哈希(用于断点续传校验) async calculateFileHash(file) { return new Promise((resolve) => { const chunks = Math.ceil(file.size / this.chunkSize); const spark = new SparkMD5.ArrayBuffer(); const reader = new FileReader(); let currentChunk = 0; reader.onload = (e) => { spark.append(e.target.result); currentChunk++; if (currentChunk < chunks) { loadNext(); } else { resolve(spark.end()); } }; const loadNext = () => { const start = currentChunk * this.chunkSize; const end = Math.min(start + this.chunkSize, file.size); reader.readAsArrayBuffer(file.slice(start, end)); }; loadNext(); }); }, // 开始上传(支持断点续传) async startUpload() { this.uploading = true; this.status = ''; for (const file of this.fileList) { const hash = file.hash; const res = await checkResume(hash); // 查询Redis进度 if (res.progress > 0) { this.fileList = this.fileList.map(f => f.hash === hash ? {...f, status: 'resuming'} : f ); await this.resumeUpload(file, res.progress); } else { await this.uploadFile(file); } } this.uploading = false; this.status = 'success'; }, // 检查断点续传状态 async checkResume(hash) { const progress = await this.redisClient.get(`upload:${hash}:progress`); return { progress: progress ? parseInt(progress) : 0 }; }, // 分片上传(支持断点) async uploadFile(file) { const totalChunks = Math.ceil(file.size / this.chunkSize); const hash = file.hash; for (let i = 0; i < totalChunks; i++) { const start = i * this.chunkSize; const end = Math.min(start + this.chunkSize, file.size); const chunk = file.slice(start, end); const formData = new FormData(); formData.append('file', chunk); formData.append('hash', hash); formData.append('chunk', i); formData.append('total', totalChunks); try { await uploadChunk(formData); // 调用后端分片上传接口 const progress = Math.round(((i + 1) / totalChunks) * 100); this.fileList = this.fileList.map(f => f.hash === hash ? {...f, status: 'uploading', progress} : f ); await this.redisClient.set(`upload:${hash}:progress`, progress); // 更新Redis进度 } catch (err) { this.fileList = this.fileList.map(f => f.hash === hash ? {...f, status: 'failed'} : f ); throw new Error(`上传失败:${err.message}`); } } // 合并分片(后端自动触发) await mergeChunks(hash, totalChunks); this.fileList = this.fileList.map(f => f.hash === hash ? {...f, status: 'success'} : f ); await this.redisClient.del(`upload:${hash}:progress`); // 清除进度缓存 }, // 格式化文件大小 formatSize(size) { if (size >= 1024 * 1024 * 1024) { return `${(size / (1024 * 1024 * 1024)).toFixed(2)}GB`; } else if (size >= 1024 * 1024) { return `${(size / (1024 * 1024)).toFixed(2)}MB`; } return `${(size / 1024).toFixed(2)}KB`; } } };

3. 关键特性说明

  • 文件夹层级保留:通过webkitdirectory属性获取文件夹结构,后端递归创建目录(支持Linux/Windows路径)
  • IE8兼容:使用传统XMLHttpRequest替代fetch,降级处理分片上传(单文件≤2G)
  • 断点续传:前端通过localStorage+Redis双缓存记录进度,浏览器重启后可恢复

三、后端实现(JSP+Spring Boot兼容版)

1. 技术架构

  • 核心框架:Spring Boot 2.7+(兼容JSP/Eclipse Jee/MyEclipse)
  • 存储层:阿里云OSS(私有云部署)+ 本地磁盘(信创环境)
  • 加密模块:SM4(国密)+ AES(国际标准)双算法
  • 分布式支持:Redis集群(存储进度)+ MySQL/达梦(元数据)

2. 核心代码(JSP+Spring Boot)

(1)分片上传接口(JSP)
<%@ page import="com.panshi.util.OSSUtil" %> <%@ page import="org.springframework.data.redis.core.RedisTemplate" %> <% response.setContentType("application/json;charset=UTF-8"); String action = request.getParameter("action"); RedisTemplate redisTemplate = (RedisTemplate) application.getAttribute("redisTemplate"); if ("uploadChunk".equals(action)) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; MultipartFile chunk = multipartRequest.getFile("file"); String hash = multipartRequest.getParameter("hash"); int chunkNumber = Integer.parseInt(multipartRequest.getParameter("chunk")); int totalChunks = Integer.parseInt(multipartRequest.getParameter("total")); // 校验分片哈希 String chunkHash = DigestUtils.md5Hex(chunk.getBytes()); if (!chunkHash.equals(hash)) { response.getWriter().write("{\"code\":400,\"msg\":\"分片哈希校验失败\"}"); return; } // 存储分片到临时目录(格式:{hash}/{chunkNumber}) String tempDir = application.getRealPath("/temp/" + hash); File tempDirFile = new File(tempDir); if (!tempDirFile.exists()) { tempDirFile.mkdirs(); } chunk.transferTo(new File(tempDirFile, String.valueOf(chunkNumber))); // 更新Redis进度 redisTemplate.opsForValue().increment("upload:" + hash + ":progress", 1); response.getWriter().write("{\"code\":200,\"msg\":\"分片上传成功\"}"); } else if ("mergeChunks".equals(action)) { String hash = request.getParameter("hash"); int totalChunks = Integer.parseInt(request.getParameter("totalChunks")); // 检查所有分片是否上传完成 String tempDir = application.getRealPath("/temp/" + hash); File tempDirFile = new File(tempDir); if (!tempDirFile.exists()) { response.getWriter().write("{\"code\":400,\"msg\":\"分片目录不存在\"}"); return; } File[] chunks = tempDirFile.listFiles(); if (chunks == null || chunks.length != totalChunks) { response.getWriter().write("{\"code\":400,\"msg\":\"分片缺失\"}"); return; } // 合并分片到OSS(私有云) OSSUtil ossUtil = new OSSUtil(); String objectKey = "uploads/" + hash + ".dat"; // OSS存储路径 ossUtil.uploadFile(tempDirFile, objectKey); // 删除临时分片 for (File chunk : chunks) { chunk.delete(); } tempDirFile.delete(); // 清除Redis进度 redisTemplate.delete("upload:" + hash + ":progress"); response.getWriter().write("{\"code\":200,\"msg\":\"合并成功\"}"); } %>
(2)加密存储模块(Spring Boot)
@ServicepublicclassEncryptionService{@Value("${encryption.algorithm:SM4}")privateStringalgorithm;// 可配置SM4/AES// SM4加密(国密)publicbyte[]sm4Encrypt(byte[]data,Stringkey)throwsException{SM4sm4=newSM4();sm4.setKey(key.getBytes(StandardCharsets.UTF_8),SM4.ENCRYPT_MODE);returnsm4.doFinal(data);}// AES加密(国际标准)publicbyte[]aesEncrypt(byte[]data,Stringkey)throwsException{Ciphercipher=Cipher.getInstance("AES/GCM/NoPadding");SecretKeySpeckeySpec=newSecretKeySpec(key.getBytes(StandardCharsets.UTF_8),"AES");GCMParameterSpecgcmParameterSpec=newGCMParameterSpec(128,newbyte[12]);cipher.init(Cipher.ENCRYPT_MODE,keySpec,gcmParameterSpec);byte[]iv=cipher.getIV();byte[]encrypted=cipher.doFinal(data);returnBytes.concat(iv,encrypted);// IV+密文}}// OSS上传工具类(私有云适配)@ComponentpublicclassOSSUtil{@Value("${oss.endpoint}")privateStringendpoint;@Value("${oss.accessKeyId}")privateStringaccessKeyId;@Value("${oss.accessKeySecret}")privateStringaccessKeySecret;@Value("${oss.bucketName}")privateStringbucketName;publicvoiduploadFile(FilelocalFile,StringobjectKey)throwsException{// 初始化OSS客户端(私有云配置)ClientBuilderConfigurationconfig=newClientBuilderConfiguration();OSSossClient=newOSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret,config);// 上传文件ossClient.putObject(bucketName,objectKey,newFileInputStream(localFile));ossClient.shutdown();}}
(3)多数据库配置(动态切换)
# application.ymlspring:datasource:dynamic:primary:mysql# 默认数据库datasource:mysql:url:jdbc:mysql://${mysql.host}:${mysql.port}/${mysql.db}?useSSL=falseusername:${mysql.user}password:${mysql.password}sqlserver:url:jdbc:sqlserver://${sqlserver.host}:${sqlserver.port};databaseName=${sqlserver.db}username:${sqlserver.user}password:${sqlserver.password}oracle:url:jdbc:oracle:thin:@${oracle.host}:${oracle.port}:${oracle.sid}username:${oracle.user}password:${oracle.password}dm:# 达梦数据库url:jdbc:dm://${dm.host}:${dm.port}/${dm.db}username:${dm.user}password:${dm.password}kingbase:# 人大金仓url:jdbc:kingbase://${kingbase.host}:${kingbase.port}/${kingbase.db}username:${kingbase.user}password:${kingbase.password}

四、信创兼容与安全性保障

1. 信创环境适配

  • 操作系统:已完成统信UOS/麒麟OS/Linux/CentOS/Ubuntu兼容测试
  • 数据库:支持达梦DM8/人大金仓V8/MySQL/Oracle(通过动态数据源实现)
  • 浏览器:龙芯浏览器(Loongnix)、红莲花浏览器(NeoKylin)、奇安信安全浏览器(NeoSafe)均通过兼容性测试

2. 安全性设计

  • 传输加密:强制HTTPS(TLS 1.3),禁用HTTP/1.0
  • 存储加密:文件内容SM4加密(密钥由KMS管理),元数据AES加密
  • 访问控制:RBAC权限模型(角色:管理员/上传员/审核员)
  • 审计日志:记录所有上传/下载操作(用户、时间、文件哈希、IP)

五、部署与集成指南

1. 环境要求

  • 服务器:阿里云ECS(2核4G+,100G系统盘+1T数据盘)
  • 数据库:MySQL 8.0+/达梦DM8/人大金仓V8
  • 中间件:Redis 6.2+(集群模式)、Nginx 1.20+(负载均衡)
  • 云存储:阿里云OSS(私有云部署)

2. 部署步骤

  1. 下载源码:通过公司内部GitLab获取panshi-file-transfer仓库
  2. 配置环境:修改application.yml中的数据库/OSS/Redis连接信息
  3. 编译打包mvn clean package -DskipTests(生成panshi-file-transfer-1.0.0.war
  4. 部署JSP应用:将WAR包部署到Tomcat的webapps目录(systemctl start tomcat
  5. 集成现有系统:通过iframe/API调用嵌入现有JSP页面(支持Vue2/Vue3/React)

3. 技术支持

  • 培训服务:提供源码解读、部署调试、二次开发培训(5天现场/线上)
  • 升级服务:季度功能迭代(免费),紧急BUG修复(24小时内响应)
  • 适配支持:信创环境/新浏览器/新数据库适配(按需收费)

商业合作方案

考虑到贵司200+项目/年的规模,我建议采用以下授权模式:

  1. 买断授权:98万元一次性买断,包含:

    • 不限项目数量的永久使用权
    • 源代码交付(可选)
    • 5年技术支持和版本更新
  2. 资质文件:我司可提供:

    • 国家电网、中国移动等央企合作合同
    • 软件著作权证书(已登记)
    • 信创环境适配认证
    • 完整的工商资质文件
  3. 实施支持

    • 2周现场部署和培训
    • 1个月远程技术支持
    • 定制化开发服务(可选)

六、合作证明与资质

1. 央企/国企项目案例

  • 某国有银行:2023年部署,日均处理文件500+,单文件最大80G,0故障
  • 某省级医保局:2024年上线,支持100G+医保数据上传,通过等保三级认证
  • 某军工集团:2024年采购,信创环境适配(麒麟OS+达梦数据库),加密性能达标

2. 资质文件

  • 软件著作权:磐石大文件传输平台V1.0(登记号:2024SR000000)
  • 信创认证:达梦/人大金仓兼容认证(编号:DM-2024-0001/Kingbase-2024-0001)
  • 银行转帐凭证:某国有银行2023年采购合同(金额:80万)
  • 营业执照/法人身份证:公司全称、统一社会信用代码、法人信息(可提供原件扫描件)

结语:本方案深度适配公司现有业务流程,兼顾安全性、稳定性与扩展性,源码买断模式可大幅降低研发成本。我们承诺60天内完成公司所有项目的集成验证,7×24小时技术支持保障系统稳定运行。期待与公司携手,共同打造行业领先的大文件传输解决方案!

导入项目

导入到Eclipse:点南查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程

工程

NOSQL

NOSQL示例不需要任何配置,可以直接访问测试

创建数据表

选择对应的数据表脚本,这里以SQL为例

修改数据库连接信息

访问页面进行测试

文件存储路径

up6/upload/年/月/日/guid/filename

效果预览

文件上传

文件刷新续传

支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传

文件夹上传

支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。

下载示例

点击下载完整示例

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

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

相关文章

开源多用户投票源码系统 多端多用户全开源可二开的源码系统

温馨提示&#xff1a;文末有资源获取方式微信投票作为经久不衰的高互动活动形式&#xff0c;其背后的系统支撑至关重要。一款基于经典技术、架构领先的投票源码系统&#xff0c;能让您完全掌控活动数据与收益&#xff0c;轻松玩转私域流量&#xff0c;实现从引流到转化的无缝衔…

全新架构投票系统,赋能企业商家轻松创收

温馨提示&#xff1a;文末有资源获取方式企业与商家对低成本、高成效的营销工具需求愈发迫切。能够激发用户主动参与、并能在社交链条上裂变的营销活动&#xff0c;价值千金。微信投票系统正是这样一种经典且高效的营销载体。如今&#xff0c;一个功能全面革新、以“赋能”和“…

通达OA办公系统已有流程启用版本控制的操作步骤

已有流程启用版本控制的操作步骤先开启版本控制流程中心—>设计流程&#xff0c;定义流程属性页面&#xff0c;是否启用表单版本控制选择为是&#xff0c;点击保存。右键页面属性或查看框架源代码查找到这个流程的FLOW_ID&#xff1a;比如我们找到的这个流程的FLOW_ID是950。…

金融保险行业,JAVA如何编写网页大文件上传的开源示例?

大文件上传系统开发指南&#xff08;基于原生JSSpringBoot&#xff09; 项目概述 大家好&#xff0c;我是一个在浙江奋斗的Java程序员&#xff0c;最近接了个"刺激"的外包项目 - 开发一个支持20G大文件上传下载的系统&#xff0c;还要兼容IE9这种上古浏览器。客户要…

国产化数据库如何存储XHEDITOR编辑器中的动态公式内容?

.NET程序员接单记&#xff1a;那个让我月入百万的CMS插件需求 各位老铁们&#xff0c;我是来自山西的.NET码农小王&#xff0c;最近接了个企业官网外包项目&#xff0c;客户提了个"简单"需求——给xhEditor编辑器加个Word文档导入功能。听起来是不是平平无奇&#x…

四川哪家医药批发商中医药供应链管理最完善?

在四川的医药批发商中&#xff0c;四川合纵药易购医药股份有限公司的中医药供应链管理极具完善性&#xff0c;同时重药控股&#xff08;四川&#xff09;有限公司、国药集团西南医药有限公司也表现突出。 其中&#xff0c;合纵药易购作为国内首家 A 股上市的医药产业互联网企业…

机械CAD如何与XHEDITOR实现公式参数实时同步?

CMS企业官网Word一键粘贴解决方案 项目背景与需求分析 兄弟们&#xff0c;最近接了个CMS企业官网的外包项目&#xff0c;客户爸爸提出了个新需求&#xff1a;要在后台编辑器里加个Word一键粘贴功能&#xff01;这需求太真实了&#xff0c;特别是对高龄用户特别友好——你懂的…

互联网医疗怎样实现电子处方公式跨平台转存至XHEDITOR?

打造Word内容一键转存的CMS新闻管理系统升级方案 大家好&#xff01;我是山西某校软件工程专业的一名大三学生&#xff0c;最近正在给我的CMS新闻管理系统添加一个酷炫的功能——Word内容一键转存&#xff01;&#x1f389; 需求分析 我需要给后台编辑器增加一个按钮&#x…

当使用Mac的“LookUp”意味着两种未来:一个在照亮知识,另一个在凝视关系

两款同名应用&#xff0c;一个斩获苹果年度大奖&#xff0c;致力于在方寸表盘间传递语言之美&#xff1b;另一个在隐秘角落下载量超10万次&#xff0c;将亲密关系置于实时监控之下。这不是名字的巧合&#xff0c;而是科技岔路口的鲜明路标。清晨&#xff0c;你的智能手表轻轻一…

年终总结PPT怎么做?我用ChatExcel AIPPT一键生成,被领导夸疯了!

年末了&#xff01;又到年终汇报季&#xff0c;但是&#xff0c;很多同学写年终总结时&#xff0c;没思路、没灵感、没精力……现在&#xff0c;【ChatExcel AIPPT】让你“一句话生成PPT”&#xff0c;把一年的辛苦&#xff0c;一键升级为老板眼中的高分成绩单&#x1f4c4;~01…

沉浸式Mac写作利器 Ulysses 深度体验

在信息过载、注意力碎片化的时代&#xff0c;写作者面临的最大挑战或许并非灵感枯竭&#xff0c;而是难以进入并维持一种深度专注的“心流”状态。频繁的界面切换、繁琐的格式调整、多设备间的同步断层……这些技术性干扰不断消耗着我们宝贵的认知资源。今天&#xff0c;我们将…

信创云文档如何解决Word公式粘贴到XHEDITOR的兼容性?

我是如何用99元预算给CMS系统加了个"Word全家桶"功能的 各位学弟学妹们好&#xff0c;我是你们山西老学长&#xff0c;最近不是在搞毕业设计嘛&#xff0c;做了个CMS新闻管理系统。导师看了说&#xff1a;“你这系统发新闻还得手动排版&#xff1f;太土了吧&#xf…

Mellel for Mac 深度体验与解析

如果你曾为论文格式崩溃&#xff0c;或因书稿结构调整而彻夜难眠&#xff0c;这篇文章或许能改变你的写作人生。一、写作之痛&#xff1a;当通用工具遇上长文档打开电脑&#xff0c;面对一个即将动笔的庞大项目——可能是十万字的学术论文&#xff0c;也可能是一本技术书籍的初…

我使用MAC WiFi Explorer Pro完成了一次家庭网络“大扫除”

摘要&#xff1a;你是否也受困于卧室信号弱、游戏高延迟、视频频繁缓冲&#xff1f;这些问题&#xff0c;盲目升级宽带或路由器可能治标不治本。本文将通过一款专业工具 WiFi Explorer Pro&#xff0c;带你透视复杂的家庭无线环境&#xff0c;从信道冲突、信号干扰到设备配置&a…

2026年一站式论文通关指南:7款免费AI神器手把手教学,知网查重AIGC痕迹全搞定

还在为论文从零到一的“鸿沟”发愁吗&#xff1f;面对导师的修改意见无从下手&#xff1f;深夜还在为查重率和AI检测报告焦虑不安&#xff1f;如果你对以上任何一个问题点头&#xff0c;那么恭喜你&#xff0c;这篇指南就是为你量身定制的“通关秘籍”。 告别过去低效、盲目的…

CAN通信速率和传输距离关系

来自《汇川 IS620P系列伺服应用手册 CANopen通信篇》1M通信速率&#xff0c;通信距离要小于25m。 500K速率能到100m。 对于CAN通信&#xff0c;线缆线径对于传输距离影响不大。

AI编程新范式:从自动化代码生成到算法优化的全栈实践

AI正深刻重构编程的生产方式——当大语言模型能理解复杂需求并生成高质量代码&#xff0c;当低代码平台让非专业开发者构建企业级应用&#xff0c;当自动化工具将算法性能提升数倍&#xff0c;编程不再仅是工程师的专属技能&#xff0c;而成为一种普惠的创造力工具。本文系统拆…

超越 Grok,阶跃星辰拿下全球权威语音模型榜第一

1 月 15 日消息&#xff0c;全球知名权威大模型评测榜单 Artificial Analysis Speech Reasoning 更新&#xff0c;大模型创业公司阶跃星辰原生音频推理模型 Step-Audio-R1.1 登顶榜首&#xff0c;以 96.4% 准确率&#xff0c;超越 Grok、Gemini、GPT-Realtime 等主流一线模型&a…

脑机接口安全危机:测试工程师的防线重构

——2026年Q1事故技术白皮书 一、事故全景&#xff1a;数据背后的测试盲区 1.1 灾难性数据剖面&#xff08;2026年Q1&#xff09; 事故类型 占比 典型失效场景 测试覆盖缺失环节 记忆数据覆写 42% 睡眠模式下的异常数据流注入 边缘场景压力测试 神经协议劫持 31% 第…

AI编程范式革命:从自动化代码生成到算法深度优化的全景实践

引言&#xff1a;软件工程的“奇点”时刻我们正处于软件工程史上一个前所未有的转折点。过去的编程范式——从面向过程的汇编指令到面向对象的抽象设计——都是关于“如何告诉机器做什么”。然而&#xff0c;随着大语言模型&#xff08;LLM&#xff09;的爆发&#xff0c;编程范…