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

山东大学软件学院项目实训-基于大模型的模拟面试系统-Vditor编辑器上传图片

Vditor编辑器图片上传功能

使用Vditor进行图片上传时,会返回图片在后端的相对路径,这在前端是无法进行显示的(如下图)
在这里插入图片描述
于是为了将图片正常·显示,我采取了和头像上传一样的解决方案,使用阿里云图床进行存储。

实现步骤

首先定位Vditor编辑器向后端发送的请求,根据浏览器的开发者工具,我们找到了具体的API(如下图)
在这里插入图片描述
下面是UploadController.java文件中的与该次请求相关的方法。

@PostMapping("/file/batch")@Transactional(rollbackFor = Exception.class)public GlobalResult<JSONObject> batchFileUpload(@RequestParam(value = "file[]", required = false) MultipartFile[] multipartFiles, @RequestParam(defaultValue = "1") Integer type, HttpServletRequest request) {TokenUser tokenUser = getTokenUser(request);File file = genFile(type);String typePath = FilePath.getPath(type);String localPath = Utils.getProperty("resource.file-path") + "/" + typePath + "/";Map<String, String> successMap = new HashMap<>(16);Set<String> errFiles = new HashSet<>();for (MultipartFile multipartFile : multipartFiles) {String orgName = multipartFile.getOriginalFilename();if (multipartFile.getSize() == 0) {errFiles.add(orgName);continue;}String fileType = FileUtils.getExtend(orgName);try {String md5 = DigestUtils.md5DigestAsHex(multipartFile.getBytes());String fileUrl = forestFileService.getFileUrlByMd5(md5, tokenUser.getIdUser(), fileType);if (StringUtils.isNotEmpty(fileUrl)) {successMap.put(orgName, fileUrl);continue;}String fileName = System.currentTimeMillis() + fileType;String savePath = file.getPath() + File.separator + fileName;File saveFile = new File(savePath);fileUrl = localPath + fileName;FileCopyUtils.copy(multipartFile.getBytes(), saveFile);forestFileService.insertForestFile(fileUrl, savePath, md5, tokenUser.getIdUser(), multipartFile.getSize(), fileType);successMap.put(orgName, localPath + fileName);} catch (IOException e) {errFiles.add(orgName);}}JSONObject data = new JSONObject(2);data.put("errFiles", errFiles);data.put("succMap", successMap);return GlobalResultGenerator.genSuccessResult(data);}

这段代码实现了一个批量文件上传的功能:

  • 主要逻辑部分:
    • 检查文件大小,跳过空文件
    • 计算文件MD5值用于去重
    • 检查数据库中是否已存在相同MD5的文件,如果存在则直接返回已有URL
    • 生成唯一文件名(时间戳+文件扩展名)
    • 构建文件保存路径
    • 将文件内容复制到目标位置
    • 在数据库中记录文件信息
    • 将文件URL添加到成功列表
  • 使用MD5进行文件去重,避免重复存储相同内容的文件
  • 使用事务确保数据一致性
  • 分别记录成功和失败的文件,提供完整的上传结果

要修改的就是file_url相关的部分,根据数据库表结构可以知道有两个列与路径有关,分别是file_pathfile_url,原本这两个列存储的是相同的值,现在进行修改将file_url改为存储真正的阿里云图床的URL。

首先在OSSUpload.java里添加一个新的上传方法:

    /*** 上传MultipartFile文件到OSS* * @param file MultipartFile文件* @param folder 文件夹路径* @return 访问URL* @throws IOException IO异常*/public String uploadFileToOSS(MultipartFile file, String folder) throws IOException {try {// 1. 获取文件名和扩展名String originalFilename = file.getOriginalFilename();String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));// 2. 生成唯一文件名String fileName = folder + UUID.randomUUID() + fileType;// 3. 上传文件到OSSossClient.putObject(ossConfig.getBucketName(),fileName,new ByteArrayInputStream(file.getBytes()));// 4. 返回访问URLreturn "https://" + ossConfig.getBucketName() + "." + ossConfig.getEndpoint() + "/" + fileName;} catch (Exception e) {throw new RuntimeException("上传文件到OSS失败: " + e.getMessage(), e);}}

然后修改batchFileUpload方法的逻辑:

    @PostMapping("/file/batch")@Transactional(rollbackFor = Exception.class)public GlobalResult<JSONObject> batchFileUpload(@RequestParam(value = "file[]", required = false) MultipartFile[] multipartFiles, @RequestParam(defaultValue = "1") Integer type, HttpServletRequest request) {TokenUser tokenUser = getTokenUser(request);File file = genFile(type);String typePath = FilePath.getPath(type);String localPath = Utils.getProperty("resource.file-path") + "/" + typePath + "/";Map<String, String> successMap = new HashMap<>(16);Set<String> errFiles = new HashSet<>();for (MultipartFile multipartFile : multipartFiles) {String orgName = multipartFile.getOriginalFilename();if (multipartFile.getSize() == 0) {errFiles.add(orgName);continue;}String fileType = FileUtils.getExtend(orgName);try {String md5 = DigestUtils.md5DigestAsHex(multipartFile.getBytes());String fileUrl = forestFileService.getFileUrlByMd5(md5, tokenUser.getIdUser(), fileType);if (StringUtils.isNotEmpty(fileUrl)) {successMap.put(orgName, fileUrl);continue;}String fileName = System.currentTimeMillis() + fileType;String savePath = file.getPath() + File.separator + fileName;File saveFile = new File(savePath);
//                fileUrl = localPath + fileName;// 使用OSS上传文件fileUrl = ossUpload.uploadFileToOSS(multipartFile, typePath + "/article");successMap.put(orgName, fileUrl);FileCopyUtils.copy(multipartFile.getBytes(), saveFile);forestFileService.insertForestFile(fileUrl, savePath, md5, tokenUser.getIdUser(), multipartFile.getSize(), fileType);
//                successMap.put(orgName, localPath + fileName);} catch (IOException e) {errFiles.add(orgName);}}JSONObject data = new JSONObject(2);data.put("errFiles", errFiles);data.put("succMap", successMap);return GlobalResultGenerator.genSuccessResult(data);}

最后,图片能够正常上传和显示:
在这里插入图片描述

http://www.xdnf.cn/news/7522.html

相关文章:

  • Prompt Tuning:轻量级大模型微调全攻略
  • KC 喝咖啡/书的复制/奶牛晒衣服/ 切绳子
  • 打破建筑与制造数据壁垒:Revit 到 STP 格式转换全攻略(含插件应用 + 迪威模型实战)
  • 闲时处理技术---CAD C#二次开发
  • C++23 容器从其他兼容范围的可构造性与可赋值性 (P1206R7)
  • CoreBluetooth 入门:扫描并连接 BLE 手环实战
  • 安卓settings单双屏显示
  • Qt调用librdkafka
  • 基于ROS2/Gazebo的室内送餐机器人系统开发实战教程
  • 山东大学计算机图形学期末复习完结篇上——24历年题
  • 动力电池点焊机厂家:驱动新能源制造的精密力量|比斯特自动化
  • 5:OpenCV—直方图均衡化
  • MySQL 8.0 OCP 1Z0-908 161-170题
  • Go语言使用通义灵码辅助开发 - AI编程助手提升效率
  • PowerBI 矩阵实现动态行内容(如前后销售数据)统计数据,以及过滤同时为0的数据
  • 【jmeter】base64加密
  • RVTools 官网遭入侵,被用于分发携带 Bumblebee 恶意软件的篡改安装包
  • C++并发性能优化思路
  • [Vue]组件介绍和父子组件间传值
  • Linux下Docker使用阿里云镜像加速器
  • 企业级物理服务器选型指南 - 网络架构优化篇
  • 蓝桥杯5130 健身
  • 从代码学习数学优化算法 - 拉格朗日松弛 Python版
  • Mujoco 学习系列(二)基础功能与xml使用
  • SPA模式下的es6如何加快宿主页的显示速度
  • 《算法笔记》11.8小节——动态规划专题->总结 问题 D: Coincidence
  • 业务流程和数据结构之间如何对应
  • Java集合框架详解:单列集合与双列集合
  • Wan2.1 图生视频 支持批量生成
  • 【QT】类A接收TCP数据并通过信号通知类B解析