uni-app uni.uploadFile上传文件时IOS APP端请求地址被提前解码

uni-app uni.uploadFile上传文件时IOS APP端请求地址被提前解码

开发环境 版本号 项目创建方式
Windows 10 HBuilderX

示例代码:

Android { “sessionId”: “53c5f9f0b91511ef8c009b0ac015785f”, “_auth_org”: “江西七叶莲科技有限公司”, “_auth_ts”: “1734314440341”, “_auth_data”: “aQoMO%2Fipvsef7zU3eLeEFOCDKXjTjHQgMtGMEkZcoo%2FDO8iXxtRTQknq8v%2F1NLqrIfEE3lMOpL8emkmQv7zdFQ%3D%3D”, “appCode”: “fwimg” }

IOS { “sessionId”: “eb900df0b93011ef8c009b0ac015785f”, “_auth_org”: “江西七叶莲科技有限公司”, “_auth_ts”: “1734314637399”, “_auth_data”: “5Yi74IQQV4LcXpFHk4ebI%2B9SFBf8ORuCCi5HQCWHglrwmLX%2F1WTsKV6nF2I%2BNUFcTEWWGEfkB%2FYOlAyLFhMvuw%3D%3D”, “appCode”: “fwimg” }


## 操作步骤:


1. IOS端使用uni.uploadFile上传文件,且URL上携带参数并含有特殊字符,比如+号 (`_auth_data=5Yi74IQQV4LcXpFHk4ebI+9SFBf8ORuCCi5HQCWHglrwmLX/1WTsKV6nF2I+NUFcTEWWGEfkB/YOlAyLFhMvuw==`)
发送之后,查看服务器端日志,或者抓包查看URL是否是编码状态

预期结果:

IOS端,uni.uploadFile上传文件 在服务器端日志没有被主动解码 输入的URL信息 仍然是URL编码的状态,即URL中的+号 还是对应的编码%2B


## 实际结果:


IOS端,uni.uploadFile上传文件,在服务器端日志显示,直接是解码状态,导致后端主动解码的时候将+号解析成了空格

bug描述:

【附件图片说明】图片是服务器上下载下来的日志,分别是android和ios的(图片上带有红色IOS标志的是IOS的日志)

【bug描述】IOS端使用uni.uploadFile上传文件,url上携带参数,例如: “sessionId=eb900df0b93011ef8c009b0ac015785f&_auth_org=江西七叶莲科技有限公司&_auth_ts=1734314637399&_auth_data=5Yi74IQQV4LcXpFHk4ebI+9SFBf8ORuCCi5HQCWHglrwmLX/1WTsKV6nF2I+NUFcTEWWGEfkB/YOlAyLFhMvuw==&appCode=fwimg” 这是URL原始状态。

我将URL进行url编码后,发送到服务端。但是校验失败。通过比对发现,IOS端将_auth_data里面的+号解析成了空格。

Android端上传文件正常,且服务器端日志显示URL是被编码的状态;再和IOS端比对,IOS端上传文件的URL在服务器的日志里面不是被编码的状态。说明URL在IOS端发出来前被提前解码。


更多关于uni-app uni.uploadFile上传文件时IOS APP端请求地址被提前解码的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app uni.uploadFile上传文件时IOS APP端请求地址被提前解码的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在处理 uni-appuni.uploadFile 方法上传文件时,如果遇到 iOS APP 端请求地址被提前解码的问题,这通常与 URL 编码有关。在 uni-app 中,上传文件的 URL 应该保持正确编码,以确保在发起网络请求时,地址不被错误地解析或修改。

以下是一个示例代码,展示了如何使用 uni.uploadFile 方法,并确保 URL 正确编码,从而避免在 iOS 端出现问题:

// 假设我们有一个需要上传的文件路径和服务器地址
const filePath = '/path/to/your/file'; // 本地文件路径
const uploadUrl = 'https://example.com/upload'; // 上传接口地址,注意这里应该是编码前的原始地址

// 在上传之前,我们确保URL没有被提前解码,实际上,uni-app内部通常会处理URL编码
// 但为了安全起见,我们可以检查或确保URL格式正确
// 注意:在大多数情况下,你不需要手动对URL进行编码,因为uni-app会处理这部分
// 但如果确实遇到编码问题,可以考虑在服务器端处理或检查URL的生成逻辑

uni.uploadFile({
    url: uploadUrl, // 直接使用原始URL,避免在此处进行编码操作
    filePath: filePath,
    name: 'file', // 文件对应的 key,服务器通过这个 key 获取文件数据
    formData: {
        user: 'test' // 其他表单数据,如用户信息
    },
    success: (uploadFileRes) => {
        console.log('上传成功:', uploadFileRes.data);
        // 这里可以处理上传成功后的逻辑,比如解析服务器返回的响应
    },
    fail: (err) => {
        console.error('上传失败:', err);
        // 处理上传失败的情况
    }
});

// 如果确实遇到URL被提前解码的问题,并且确定问题出在URL生成或传递上
// 可以考虑在服务器端检查URL的接收和处理逻辑,或者在APP端检查URL的拼接逻辑
// 但在大多数情况下,uni-app和原生小程序的框架会处理URL的编码问题

// 另外,确保在iOS真机上测试,因为模拟器可能无法完全复现真机上的行为

在上面的代码中,我们直接使用了原始的 uploadUrl,而没有对其进行手动编码。uni-app 通常会自动处理 URL 的编码问题。如果遇到特定的编码问题,更可能是服务器端或 URL 生成/传递逻辑的问题,而非客户端代码本身。

如果问题依旧存在,建议检查以下几点:

  1. 服务器端是否对 URL 进行了不必要的解码。
  2. URL 是否在传递过程中被错误地修改或拼接。
  3. 确保在 iOS 真机上进行测试,因为模拟器可能无法准确反映真机的行为。
回到顶部