智能云协同图库第9期小问题点(摆烂版

解决过程

断点打到这里就返回403状态码,一般来说就是鉴权出问题了

image-20250506011646947

从浏览器控制台返回的扩图链接是可以正常访问的,那么就可以思考后端是否做了处理导致链接变了导致无法访问呢?

image-20250506012035270

往上翻在验证URL之前原始的扩图链接就被编码过了,导致无法访问。

image-20250506012704649

继续往前翻,上传图片第一步骤就是触发validPicture 方法验证图片 image-20250506013111665

继续翻,到了服务层。这里是为了兼容文件上传与链接上传做了处理 一般在浏览器复制的图片链接,不用鉴权就能获取的 image-20250506013309657

继续找到了发现在接口层的时候URL就已经被编码过了。

%2B会编码成 + 号导致签名错误

image-20250506015031922 image-20250506014855827

尝试把这里转换回去原始链接

java
复制代码
package com.sion.sionpicturebackend.utils; public class UrlUtils { /** * 修复阿里云AI扩图URL中被误解码的“+”符号(空格 → +) */ public static String fixAliImageAIUrl(String url) { if (url == null) { return null; } boolean isAliAIUrl = url.contains("oss-cn-shanghai.aliyuncs.com") && url.contains("/service_dashscope/ImageOutPainting/") && url.contains("Signature"); // 仅修复这类链接中的空格 if (isAliAIUrl) { return url.replace(" ", "+"); } return url; } }
java
复制代码
@PostMapping("/upload/url") public BaseResponse<PictureVO> uploadPictureByUrl(@RequestBody PictureUploadRequest pictureUploadRequest, HttpServletRequest request) { User loginUser = userService.getLoginUser(request); String fileUrl = pictureUploadRequest.getFileUrl(); // 处理阿里云签名链接 fileUrl = UrlUtils.fixAliImageAIUrl(fileUrl); PictureVO pictureVO = pictureService.uploadPicture(fileUrl, pictureUploadRequest, loginUser); return ResultUtils.success(pictureVO); }

哎!别生气看来不是这个原因,依旧无法保存

看看这个请求方式是不是有问题 image-20250506021550677

✅ 为什么会出现这个问题?

阿里云 OSS 的签名 URL 是敏感的,如果:

  • URL 被重新编码(如 %2B 被还原成 +,或反之)(只在浏览器中确认过)
  • 请求方法或请求头(例如 CanonicalizedResource)与签名计算时不同
  • 你用 HEAD 或自定义头模拟 GET 请求,但和原浏览器请求不一致
  • 参数顺序、空格、解码、编码等稍有变化

都可能会导致签名校验失败。

解决方案

浏览器请求没有问题,程序请求有问题 那么我们模拟浏览器发送get请求试试,反正用的是阿里提供的对象存储资源不用节省它的流量

java
复制代码
// 更精确判断是否为阿里云AI扩图返回链接 isAliOSS = fileUrl != null && fileUrl.contains("vigen-invi.oss-cn-shanghai.aliyuncs.com"); Method method = isAliOSS ? Method.GET : Method.HEAD; response = HttpRequest.of(fileUrl, StandardCharsets.UTF_8) .method(method) .header("User-Agent", "Mozilla/5.0") .timeout(3000) .execute();

好,非常好,特别好,遇见你更好 , 至此已成艺术

image-20250506024405054

返回的图像链接会失效,可能是10来分钟。所以不要断点调试太久,可能你已经写对代码了,但图片已经403了哈哈

那么问题又来啦!图片过大!(开摆 image-20250506024531437

我这里扩图业务返回的链接给两倍空间,让其通过图片大小验证再让腾讯云帮我压缩

但这只是很暴力的解决方案

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
Sion
下载 APP