若依项目文件上传踩坑记:从本地磁盘迁移到阿里云OSS的完整实战(附富文本编辑器修复方案)

张开发
2026/4/15 15:36:51 15 分钟阅读

分享文章

若依项目文件上传踩坑记:从本地磁盘迁移到阿里云OSS的完整实战(附富文本编辑器修复方案)
若依项目文件上传踩坑记从本地磁盘迁移到阿里云OSS的完整实战附富文本编辑器修复方案当Java后端开发者决定将若依项目的文件存储从本地迁移到阿里云OSS时往往会遇到一系列意料之外的坑。本文将分享一个真实的迁移案例从问题发现到最终解决的全过程帮助开发者少走弯路。1. 迁移前的准备工作在开始迁移之前我们需要确保基础环境已经就绪。阿里云OSS的配置是整个迁移过程的第一步也是最关键的一环。首先在阿里云控制台创建Bucket时建议选择杭州区域oss-cn-hangzhou这是阿里云OSS最早部署的区域稳定性和兼容性都经过长期验证。创建完成后需要记录以下关键信息AccessKey ID和AccessKey SecretEndpoint地址如oss-cn-hangzhou.aliyuncs.comBucket名称自定义域名可选接下来在项目中添加必要的依赖!-- 文件存储核心库 -- dependency groupIdorg.dromara.x-file-storage/groupId artifactIdx-file-storage-spring/artifactId version2.1.0/version /dependency !-- 阿里云OSS SDK -- dependency groupIdcom.aliyun.oss/groupId artifactIdaliyun-sdk-oss/artifactId version3.16.1/version /dependency2. 配置文件存储服务在application.yml中配置OSS连接信息时有几个细节需要特别注意dromara: x-file-storage: default-platform: aliyun-oss-1 thumbnail-suffix: .min.jpg aliyun-oss: - platform: aliyun-oss-1 enable-storage: true access-key: ${your-access-key} secret-key: ${your-secret-key} end-point: oss-cn-hangzhou.aliyuncs.com bucket-name: your-bucket-name domain: https://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/ base-path: ruoyi-upload/ # 建议设置基础路径注意base-path参数建议设置一个明确的路径前缀避免文件直接存放在Bucket根目录下这有助于后续管理和维护。3. 修改文件上传逻辑若依默认的文件上传逻辑需要重写以适应OSS存储。以下是修改后的关键代码Autowired private FileStorageService fileStorageService; PostMapping(/upload) public AjaxResult uploadFile(MultipartFile file) throws Exception { try { // 按日期组织文件存储路径 String objectName LocalDate.now().format(DateTimeFormatter.ofPattern(yyyy/MM/dd)) /; FileInfo fileInfo fileStorageService.of(file) .setPath(objectName) .upload(); AjaxResult ajax AjaxResult.success(); ajax.put(url, fileInfo.getUrl()); ajax.put(fileName, fileInfo.getUrl()); // 注意这里返回的是完整URL ajax.put(newFileName, fileInfo.getUrl()); ajax.put(originalFilename, file.getOriginalFilename()); return ajax; } catch (Exception e) { return AjaxResult.error(e.getMessage()); } }关键修改点去除了本地文件路径相关的代码使用日期作为子目录便于文件管理返回的fileName字段改为完整的URL这是前端显示的关键4. 富文本编辑器图片处理迁移到OSS后富文本编辑器中的图片显示是最容易出问题的部分。以下是完整的解决方案4.1 前端修改在富文本编辑器组件中需要修改图片上传成功的处理逻辑function handleUploadSuccess(res, file) { if (res.code 200) { let quill toRaw(quillEditorRef.value).getQuill(); let length quill.selection.savedRange.index; let imageUrl res.fileName; // 不再添加baseURL前缀 if (!imageUrl.startsWith(http)) { imageUrl import.meta.env.VITE_APP_BASE_API imageUrl; } quill.insertEmbed(length, image, imageUrl); quill.setSelection(length 1); } else { proxy.$modal.msgError(图片插入失败); } }4.2 后端调整确保后端返回的图片URL已经是完整的OSS访问地址不需要前端再做拼接。这是避免富文本编辑器显示问题的关键。5. 用户头像上传与显示用户头像的处理有其特殊性因为涉及到缓存和即时显示的问题。以下是完整的解决方案5.1 后端修改PostMapping(/avatar) public AjaxResult avatar(RequestParam(avatarfile) MultipartFile file) throws Exception { try { if (!file.isEmpty()) { String objectName avatar/ LocalDate.now().format(DateTimeFormatter.ofPattern(yyyy/MM/dd)) /; FileInfo fileInfo fileStorageService.of(file).setPath(objectName).upload(); LoginUser loginUser getLoginUser(); String avatar fileInfo.getUrl(); if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { AjaxResult ajax AjaxResult.success(); ajax.put(imgUrl, avatar); loginUser.getUser().setAvatar(avatar); tokenService.setLoginUser(loginUser); return ajax; } } } catch (Exception e) { return AjaxResult.error(e.getMessage()); } return AjaxResult.error(上传图片异常请联系管理员); }5.2 前端调整前端需要确保正确处理返回的URLfunction uploadImg() { proxy.$refs.cropper.getCropBlob((data) { let formData new FormData(); formData.append(avatarfile, data, options.filename); uploadAvatar(formData).then((response) { open.value false; // 直接使用返回的完整URL options.img response.imgUrl; userStore.avatar options.img; proxy.$modal.msgSuccess(修改成功); visible.value false; }); }); }6. 常见问题与解决方案在实际迁移过程中我们遇到了以下几个典型问题图片上传成功但前端不显示原因返回的URL不完整解决确保后端返回完整的OSS访问URL富文本编辑器历史内容显示异常原因旧内容使用的是本地路径解决编写数据迁移脚本批量更新数据库中的图片路径头像刷新后不显示原因前端缓存未更新解决在URL后添加时间戳参数如${url}?t${Date.now()}上传速度慢原因未启用分片上传解决配置OSS客户端启用分片上传7. 性能优化建议完成基本迁移后可以考虑以下优化措施CDN加速为OSS Bucket配置CDN加速提升图片加载速度图片处理利用OSS的图片处理功能实现缩略图、水印等生命周期管理设置自动删除过期的临时文件监控告警配置OSS的访问监控及时发现异常在实际项目中我们发现将文件存储迁移到OSS后系统整体性能提升了约30%特别是在多地域访问场景下效果更为明显。

更多文章