当前位置: 首页 > news >正文

在Vue3中实现文件上传功能,结合后端API

随着现代Web应用程序的不断发展,文件上传成为了用户交互中不可或缺的一部分。在本篇博客中,我们将深入讨论如何在Vue3中实现一个文件上传功能,并与后端API进行交互。我们将使用Vue3的Composition API(setup语法糖)来构建我们的示例。

1. 了解需求

在实现文件上传之前,我们需要明确我们的需求。假设我们的应用程序允许用户上传他们的头像。我们需要提供一个文件选择器,用户可以通过这个选择器选择文件,并在选择文件后,系统会将文件上传到后端API,并返回上传的结果。

后端API设计

我们的后端API使用POST请求,路径为/api/upload,并要求上传的文件通过multipart/form-data形式提交。响应结果将包含上传文件的URL和一些文件信息。

2. 创建Vue3项目

如果你还没有创建Vue3项目,请使用以下命令搭建一个新的Vue3项目:

npm install -g @vue/cli
vue create vue-file-upload
cd vue-file-upload

选择适合你项目的配置,完成后安装依赖。

3. 编写上传组件

src/components目录下创建一个名为FileUpload.vue的新文件,这是我们处理文件上传的组件。

FileUpload.vue
<template><div class="file-upload"><h2>头像上传</h2><input type="file" @change="handleFileChange" /><button @click="uploadFile" :disabled="!selectedFile">上传</button><p v-if="uploadMessage" :class="{ success: isSuccess, error: !isSuccess }">{{ uploadMessage }}</p></div>
</template><script setup>
import { ref } from 'vue';
import axios from 'axios';const selectedFile = ref(null);
const uploadMessage = ref('');
const isSuccess = ref(false);const handleFileChange = (event) => {const file = event.target.files[0];if (file) {selectedFile.value = file;uploadMessage.value = ''; // 清除以前的消息}
};const uploadFile = async () => {if (!selectedFile.value) return;const formData = new FormData();formData.append('file', selectedFile.value);try {const response = await axios.post('/api/upload', formData, {headers: {'Content-Type': 'multipart/form-data',},});if (response.data.url) {uploadMessage.value = '文件上传成功!';isSuccess.value = true;} else {uploadMessage.value = '文件上传失败,请重试。';isSuccess.value = false;}} catch (error) {uploadMessage.value = '上传过程中出现错误,请稍后再试。';isSuccess.value = false;} finally {selectedFile.value = null; // 上传完成后重置文件输入}
};
</script><style scoped>
.file-upload {max-width: 400px;margin: auto;padding: 20px;border: 1px solid #ccc;border-radius: 5px;
}
.success {color: green;
}
.error {color: red;
}
</style>
代码解析
  • 模板部分:我们创建了一个文件选择器和一个按钮,当用户选择文件并点击"上传"按钮时,uploadFile方法将被调用。
  • 响应式变量:我们使用ref来创建响应式变量selectedFileuploadMessageisSuccess,以管理文件的选择状态和上传状态。
  • 事件处理handleFileChange方法用于处理用户选择的文件,并将其存储在selectedFile中。uploadFile方法则负责将文件上传到后端。
  • 文件上传:我们使用axios库来发送POST请求。我们将选中的文件附加到FormData中,并设置适当的请求头## 4. 配置Axios

在项目中安装axios库,用于HTTP请求。如果你还没有安装,可以使用如下命令:

npm install axios

接下来,在src/main.js中导入axios,并可以配置基本的API路径(假设你的API服务器在本地的8080端口)。

import { createApp } from 'vue';
import App from './App.vue';
import axios from 'axios';axios.defaults.baseURL = 'http://localhost:8080'; // 替换为后端API的基础URLcreateApp(App).mount('#app');

5. 整合与测试

在你的App.vue中,导入并使用FileUpload组件:

<template><div id="app"><FileUpload /></div>
</template><script setup>
import FileUpload from './components/FileUpload.vue';
</script><style>
/* 添加你的全局样式 */
</style>

现在,你可以通过运行以下命令启动你的Vue应用:

npm run serve

打开浏览器并访问http://localhost:8080,你应该能看到文件上传的组件。

6. 后端API示例

为了演示前端应用的完整性,这里提供一个简单的Node.js后端API示例。你可以使用Express框架来处理文件上传。

在一个新的目录中初始化一个Node.js项目,并安装依赖:

npm init -y
npm install express multer cors
server.js
const express = require('express');
const multer = require('multer');
const cors = require('cors');
const path = require('path');const app = express();
const upload = multer({ dest: 'uploads/' }); // 文件将被保存在uploads目录app.use(cors());app.post('/api/upload', upload.single('file'), (req, res) => {if (!req.file) {return res.status(400).send({ error: '请上传一个文件' });}// 返回文件信息const filePath = path.join(__dirname, 'uploads', req.file.filename);res.send({ url: filePath, filename: req.file.originalname });
});const PORT = 8080;
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});
启动后端API

确保在终端中运行以下命令启动后端服务器:

node server.js

7. 总结

在本篇博客中,我们演示了如何在Vue3中使用Composition API实现文件上传功能,并与后端API进行交互。这种方式提供了清晰和结构化的代码,使得代码更易于维护和扩展。


最后问候亲爱的朋友们,并邀请你们阅读我的全新著作

在这里插入图片描述

相关文章:

在Vue3中实现文件上传功能,结合后端API

随着现代Web应用程序的不断发展&#xff0c;文件上传成为了用户交互中不可或缺的一部分。在本篇博客中&#xff0c;我们将深入讨论如何在Vue3中实现一个文件上传功能&#xff0c;并与后端API进行交互。我们将使用Vue3的Composition API&#xff08;setup语法糖&#xff09;来构…...

智慧商城:点击“加入购物车”判断是否登录来进行跳转到登录页登录并回跳 + 发请求渲染加入购物车数量的角标

点击“加入购物车”判断是否登录来进行跳转到登录页登录并回跳 按需引入需要的 Dialog 组件并进行全局注册 Vue.use( )仅仅在Vue组件的上下文中起作用&#xff0c;所以在Vue组件中通过 this.$ 来使用 在 js 文件中则还要导入&#xff0c;然后直接使用&#xff0c;并不需要 this…...

植物大战僵尸杂交版v3.0.2最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.0.2版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/5c…...

后端统一接口返回状态【初步模板】

后端统一接口返回状态【模板】 文章目录 后端统一接口返回状态【模板】1 .Result类编写2 .Constants类编写3 .更改Controller层下的类return格式 开发过程中&#xff0c;每个接口的返回格式设计都是一样的&#xff0c;这样可以大大提高开发效率。 项目结构如下图&#xff1a;分…...

QML Text组件

文章目录 前言主体基本文本显示字体和样式富文本支持长文本的处理文本样式与效果超链接Label 元素总结 前言 在 QML 中&#xff0c;Text 和 Label 是常用的文本显示元素&#xff0c;它们在显示文本方面具有相似性&#xff0c;但在功能和定制性上也存在一些差异。Text 元素用于…...

cv2.addWeighted用法详解

cv2.addWeighted 是 OpenCV 中用于图像加权叠加的函数&#xff0c;常用于将两张图像按一定比例融合在一起。它通过对两张图像的像素进行加权和求和的操作&#xff0c;可以实现透明度调整、图像混合、图像融合等效果。 函数定义 cv2.addWeighted(src1, alpha, src2, beta, gam…...

基于微信小程序的消防隐患在线举报系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…...

牛客网 SQL36查找后排序

SQL36查找后排序 select device_id,age from user_profile order by age asc #select [字段1,字段2] from [表名] order by [字段1] [升序(asc)/降序(desc)],[字段2] [升序(asc)/降序(desc)] #select&#xff1a;查询 #order by 排序 每日问题 如何实现对象的克隆&#xff1…...

Dart 中的构造函数

在 Dart 中&#xff0c;类的构造函数用于初始化类的对象。当你创建一个类的实例时&#xff0c;构造函数被自动调用。Dart 支持多种构造函数的写法&#xff0c;包括常规构造函数、命名构造函数、工厂构造函数等。 一、传统构造函数 默认构造函数是没有名字的构造函数&#xff…...

实现 WebSocket 接入文心一言

目录 什么是 WebSocket&#xff1f; 为什么需要 WebSocket&#xff1f; HTTP 的局限性 WebSocket 的优势 总结&#xff1a;HTTP 和 WebSocket 的区别 WebSocket 的劣势 WebSocket 常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 WebSocket 心跳机制 …...

GO--堆(have TODO)

堆 堆&#xff08;Heap&#xff09;是一种特殊的数据结构。它是一棵完全二叉树&#xff08;完全二叉树是指除了最后一层外&#xff0c;每一层上的节点数都是满的&#xff0c;并且最后一层的节点都集中在左边&#xff09;&#xff0c;结放在数组&#xff08;切片&#xff09;中…...

【Python随笔】Enigma密码机的原理及python代码实现

最近笔者接触到了Cypher这款游戏&#xff0c;玩法很简单&#xff0c;就是通过文字、图片等各种表达手段组成的谜面&#xff0c;猜一段英文&#xff0c;算是初步接触了密码学的一些知识。游戏中提到了很多类型的密码&#xff0c;其中Enigma密码机就是单独一种&#xff0c;在电影…...

二叉树 -- 堆(详解)

目录 1、堆的概念及结构 2、堆的实现(附代码) 2.1、向下调整算法建堆 3、堆的应用(附代码) 3.1、堆排序 3.2、TOP-K问题 1、堆的概念及结构 如果有一个关键码的集合K { k0&#xff0c;k1 &#xff0c;k2 &#xff0c;…&#xff0c;k(n-1) }&#xff0c;把它的所有元素…...

gradle项目下载依赖报错

报错信息 Cannot resolve external dependency org.projectlombok:lombok:1.18.36 because no repositories are defined. Required by:project :Possible solution:- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/…...

WPS怎么都无法删除空白页_插入空白页一次插入两张?_插入横屏空白页_横屏摆放图片_这样解决_显示隐藏段落标记---WPS工作笔记001

在wps使用的过程中你们有没有碰到过这种问题,就是,我贴图,因为图片太大,我需要把图片,横屏显示,这个时候我需要插入一个空白页,那么,在空白菜单下,点击,有时候会点击插入空白页,会一下子自动插入两张空白页.而且,怎么删除都删除不掉. 都快疯掉了. 网上搜索也没有找到好的方法,后…...

flask before_request 请求拦截器返回无值则放行,有值则拦截

环境 Python 3.11.5 Flask 2.2.2完整代码如下&#xff1a; from flask import Flask, make_response, Blueprintapp Flask(__name__) user_blue Blueprint(user, __name__, url_prefix/api/user) user_blue.before_request def befor…...

前端XMLHttpRequest get请求能不能在body中传参数?

文档 查看mdn文档&#xff0c;文档XMLHttpRequest.send()有提到&#xff1a; XMLHttpRequest.send() 方法接受一个可选的参数&#xff0c;其作为请求主体&#xff1b;如果请求方法是 GET 或者 HEAD&#xff0c;则应将请求主体设置为 null。 测试 一个简单的nodejs服务器 var…...

C语言的函数指针

介绍案例 什么是函数指针&#xff1f; 函数指针 是指向函数的指针变量&#xff0c;它可以用来间接调用函数。在 C/C 中&#xff0c;函数指针允许程序在运行时选择调用不同的函数&#xff0c;这使得代码更加灵活和动态。函数指针广泛应用于回调函数、事件处理、动态选择算法等…...

网络安全的学习方向和路线是怎么样的?

石器时代 第一个阶段——石器时代&#xff0c;针对的是纯新手小白刚刚入场。在这个阶段&#xff0c;主要是打基础&#xff0c;需要学习的有五部分内容&#xff1a; Windows Windows上基础的一些命令、PowerShell的使用和简单脚本编写&#xff0c;以及Windows以后经常会打交道…...

酒蒙子骰子小程序系统

酒蒙子流量变现小程序小游戏 后端tp8 前端uniapp 会员变现 分销推广 流量主 …...

html+css网页设计 美食 餐饮杰12个页面

htmlcss网页设计 美食 餐饮杰12个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff…...

【济大期末数据库】SQL语法速成

目录 SQL分类 DDL 概念 语法 操作数据库&#xff1a; 1.查询所有数据库 2.查询当前数据库 3.创建数据库 4.删除数据库 5.切换数据库 操作数据库内的表&#xff1a; 1.查询当前数据库所有表 2.查看指定表结构 3.创建表 DML 概念 语法 增&#xff08;INSERT&am…...

WeakAuras NES Script(lua)

WeakAuras NES Script 修星脚本字符串 脚本1&#xff1a;NES !WA:2!TMZFWXX1zDxVAs4siiRKiBN4eV(sTRKZ5Z6opYbhQQSoPtsxr(K8ENSJtS50(J3D7wV3UBF7E6hgmKOXdjKsgAvZFaPTtte0mD60XdCmmecDMKruyykDcplAZiGPfWtSsag6myGuOuq89EVDV9wPvKeGBM7U99EFVVVV33VFFB8Z2TJ8azYMlZj7Ur3QDR(…...

国内网络在Ubuntu 22.04中在线安装Ollama并配置Open-WebuiDify

配置docker科技网络 登录后复制 创建或编辑 Docker 配置文件 让docker使用代理&#xff1a; sudo mkdir /etc/systemd/system/docker.service.d -p sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf 文件&#xff0c;并添加以下内容&#xff1a; [Service] En…...

SQL 插入数据详解

本文介绍如何利用 SQL 的 INSERT 语句将数据插入表中。 1. 数据插入 顾名思义&#xff0c;INSERT 用来将行插入&#xff08;或添加&#xff09;到数据库表。插入有几种方式&#xff1a; 插入完整的行&#xff1b;插入行的一部分&#xff1b;插入某些查询的结果。 下面逐一介…...

中小学教室多媒体电脑安全登录解决方案

中小学教室多媒体电脑面临学生随意登录的问题&#xff0c;主要涉及到设备使用、网络安全、教学秩序等多个方面。以下是对这一问题的详细分析&#xff1a; 一、设备使用问题 1. 设备损坏风险 学生随意登录可能导致多媒体电脑设备过度使用&#xff0c;增加设备损坏的风险。不当…...

Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能

背景&#xff1a;现在有一个新需求&#xff0c;需要借助树结构来实现词库的分类管理&#xff0c;树的节点是不同的分类&#xff0c;不同的分类可以有自己的词库&#xff0c;所以父子节点是互不影响的&#xff1b;同样为了选择的方便性&#xff0c;提出了新需求&#xff0c;选择…...

Pycharm和Jupyter Notebook的比较【笔记】

1、Pycharm 特点&#xff1a; &#xff08;1&#xff09;集成开发环境&#xff08;IDE&#xff09;&#xff1a;提供了丰富的功能&#xff0c;如代码自动补全、错误检查、调试工具等。 &#xff08;2&#xff09;项目管理&#xff1a;支持大型项目的管理和组织&#xff0c;适合…...

MongoDB(下)

MongoDB 索引 MongoDB 索引有什么用? 和关系型数据库类似&#xff0c;MongoDB 中也有索引。索引的目的主要是用来提高查询效率&#xff0c;如果没有索引的话&#xff0c;MongoDB 必须执行 集合扫描 &#xff0c;即扫描集合中的每个文档&#xff0c;以选择与查询语句匹配的文…...

AI Agent与MEME:技术与文化融合驱动Web3创新

AI Agent如何引领Web3新时代&#xff1f; 随着Web3与区块链技术的迅速发展&#xff0c;AI Agent作为人工智能与区块链的交汇点&#xff0c;正在逐步成为推动去中心化生态的重要力量。同时&#xff0c;MEME文化凭借其强大的社区驱动力和文化渗透力&#xff0c;在链上生态中扮演着…...

前端如何将pdf等文件传入后端

我们知道在js中我们可以通过&#xff1a; <input type"file" name"file" id"fileInput" accept"image/*">来输入文件。其中type指后端url&#xff0c;accept来限制传入类型。 前端通过表单形式将其传入后端 那么前端是怎么将…...

山景BP1048蓝牙音频任务后台运行设置方法

1、 问题 山景BP1048提供的蓝牙音箱SDK蓝牙音频是不能在后台运行的。例如&#xff1a;现在进入U盘模式播放蓝牙音乐&#xff0c;那么此时蓝牙就会关闭。 但是在特定场景下&#xff0c;需要蓝牙保持连接。 2、解决办法 打开sys_param.c文件 #include <string.h> #incl…...

【服务器】服务器进程运行不受本地终端影响的方法总结

服务器进程运行不受本地终端影响的方法总结 1. 使用 nohup2. 使用 setsid3. 将命令放入后台 (&)总结参考 为了确保在集群或服务器上运行的长时间作业不受本地计算机网络中断或用户注销的影响&#xff0c;可以使用以下三种方法&#xff1a;nohup、setsid 和将命令放入后台 (…...

[数据结构] 链表

目录 1.链表的基本概念 2.链表的实现 -- 节点的构造和链接 节点如何构造? 如何将链表关联起来? 3.链表的方法(功能) 1).display() -- 链表的遍历 2).size() -- 求链表的长度 3).addFirst(int val) -- 头插法 4).addLast(int val) -- 尾插法 5).addIndex -- 在任意位置…...

WPF DataTemplate 数据模板

DataTemplate 顾名思义&#xff0c;数据模板&#xff0c;在 wpf 中使用非常频繁。 它一般用在带有 DataTemplate 依赖属性的控件中&#xff0c;如 ContentControl、集合控件 ListBox、ItemsControl 、TabControls 等。 1. 非集合控件中使用 <UserControl.Resources>&l…...

本地计算机上的MySQL服务启动后停止(connection refused: connect)解决一系列数据库连接不上的问题

推荐其他可能可以解决的博客&#xff1a; 【完美解决】mysql启动不了:本地计算机上的MySQL服务启动后停止-CSDN博客 1. 查看自己的mysql服务是否启动了&#xff0c;如果启动后又关闭了就使用下面这种方法 我是使用重新安装 MySQL 服务解决的 如果服务依然启动失败&#xf…...

前端使用 Konva 实现可视化设计器(20)- 性能优化、UI 美化

这一章主要分享一下使用 Konva 遇到的性能优化问题&#xff0c;并且介绍一下 UI 美化的思路。 至少有 2 位小伙伴积极反馈&#xff0c;发现本示例有明显的性能问题&#xff0c;一是内存溢出问题&#xff0c;二是卡顿的问题&#xff0c;在这里感谢大家的提醒。 请大家动动小手&a…...

ECharts平行坐标系-营养结构(平行坐标)-3,附视频讲解与代码下载

引言&#xff1a; 平行坐标系&#xff08;Parallel Coordinates&#xff09;是可视化高维几何和分析多元数据的常用方法。它通过在n维空间中显示一组点&#xff0c;绘制由n条平行线组成的背景&#xff08;通常是垂直且等距的&#xff09;&#xff0c;并将描述不同变量的各点连…...

蓝桥杯刷题——day8

蓝桥杯刷题——day8 题目一题干解题思路代码 题目二题干解题思路代码 题目一 题干 N 架飞机准备降落到某个只有一条跑道的机场。其中第i架飞机在 Ti时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 Di个单位时间&#xff0c;即它最早可以于 Ti时刻开始降落&am…...

WPF ControlTemplate 控件模板

区别于 DataTemplate 数据模板&#xff0c;ControlTemplate 是控件模板&#xff0c;是为自定义控件的 Template 属性服务的&#xff0c;Template 属性类型就是 ControlTemplate。 演示&#xff0c; 自定义一个控件 MyControl&#xff0c;包含一个字符串类型的依赖属性。 pub…...

【Git 常用操作:pull push】

Git 基本概念 Git 是一个先进的开源的分布式版本控制系统&#xff0c;常用于管理工作内容、项目代码等功能。 Git 工作流程 图片来源&#xff1a;https://www.runoob.com/git/git-basic-operations.html 说明&#xff1a; workspace&#xff1a;工作区staging area&#xff…...

初学stm32 --- 系统时钟配置

众所周知&#xff0c;时钟系统是 CPU 的脉搏&#xff0c;就像人的心跳一样。所以时钟系统的重要性就不言而喻了。 STM32 的时钟系统比较复杂&#xff0c;不像简单的 51 单片机一个系统时钟就可以解决一切。于是有人要问&#xff0c;采用一个系统时钟不是很简单吗&#xff1f;为…...

基于SpringBoot的图书管理系统(源码+数据库+报告)

一、项目介绍 358基于SpringBoot的图书管理系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块 二、项目技术 编程语言&#xff1a;Java 数据库&#xff1a;MySQL 项目管理工具&#xff1a;Maven 前端技术&#xff1a;Vue 后端技术&#x…...

物理信息神经网络(PINN)八课时教案

物理信息神经网络&#xff08;PINN&#xff09;八课时教案 第一课&#xff1a;物理信息神经网络概述 1.1 PINN的定义与背景 物理信息神经网络&#xff08;Physics-Informed Neural Networks&#xff0c;简称PINN&#xff09;是一种将物理定律融入神经网络训练过程中的先进方…...

APM32F411使用IIS外设驱动es8388实现自录自播

前言&#xff1a; 从零开始学习I2s外设&#xff0c;配置Es8288寄存器实现录音播放。本文章使用主控芯片是APM32F411系类。音频相关的概念比较多&#xff0c;就不再次做过多的介绍&#xff0c;本文章只是简单实现边录边播功能。APM系类兼容st的芯片&#xff0c;所以用st的hal库来…...

flink SQL实现mysql source sink

接上文&#xff1a;一文说清flink从编码到部署上线 环境说明&#xff1a;MySQL&#xff1a;5.7&#xff1b;flink&#xff1a;1.14.0&#xff1b;hadoop&#xff1a;3.0.0&#xff1b;操作系统&#xff1a;CentOS 7.6&#xff1b;JDK&#xff1a;1.8.0_401。 1.代码实现 1.1 E…...

【C#】实现Json转Lua (Json2Lua)

关键词: C#、JsonToLua、Json2Lua、对象序列化Lua 前提需引入NewtonsofJson&#xff0c;引入方法可先在Visual Studio 2019 将Newtonsoft.Json.dll文件导入Unity的Plugins下。 Json格式字符串转Lua格式字符串&#xff0c;效果如下&#xff1a; json字符串 {"1": &q…...

使用 Vue3 实现摄像头拍照功能

参考资料:MediaDevices.getUserMedia() - Web API | MDN 重要: navigator.mediaDevices.getUserMedia 需要在安全的上下文中运行。现代浏览器要求摄像头和麦克风的访问必须通过 HTTPS 或 localhost&#xff08;被视为安全的本地环境&#xff09;进行,如果上传服务器地址是http…...

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…...

CEF127 编译指南 MacOS 篇 - 拉取 CEF 源码(五)

1. 引言 在完成了所有必要工具的安装和配置后&#xff0c;我们进入到获取 CEF 源码的阶段。对于 macOS 平台&#xff0c;CEF 的源码获取过程需要特别注意不同芯片架构&#xff08;Intel 和 Apple Silicon&#xff09;的区别以及版本管理。本文将详细介绍如何在 macOS 系统上获…...