uni-app uni.uploadFile上传文件时IOS APP端请求地址被转义

uni-app uni.uploadFile上传文件时IOS APP端请求地址被转义

项目信息 详细信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 win10
手机系统 iOS
手机系统版本号 IOS 14
手机厂商 苹果
手机机型 iphone xr
页面类型 vue
打包方式 云端
项目创建方式 HBuilderX

示例代码:

uni.uploadFile({  
    // 地址带有token信息,会出现%3D被修改成=
    url: postUrl,  
    filePath: filePath,  
    formData: {key: key},  
    success: res => {  
        if (res.statusCode === 204) {  
            callback(imageUrl)  
        } else {  
            showErrorMessage('图片上传失败')  
        }  
    },  
    fail: res => {  
        showErrorMessage('图片上传失败')  
    }  
})

操作步骤:

  • 必现

预期结果:

  • url地址保持不变

实际结果:

  • url地址被转义

bug描述:

项目所有的请求都是正常的,在做到个人中心-上传头像时,使用uni.uploadFile进行请求时,发现token被转义。

正常接口请求URL:

POST http://domain.com/api/Users/Update?appkey=APPKEY&token=F%2F7jyw7ouOlCJOjg5Lt2Qe%2B47Y7QCsCzFcrov3INYQRAtVaMz7tSTOOmGT8DdkPWE9spRyWLEyfc%2BGiF8bhyFfLzBaSGNm2bddMJ666SHB%2F3scHJCR25P9ok3FhPqDq8fjryPir7TKkveqOS5TtElilq3pbYdEcvQF6BQ%2B76OPmkWiSHaVeSIRNqvecDw0zmxf7mDO8TZT3%2FztR72qbugHEoSYbzDNvoPCuoSsjcJSdOJPNoVXAOd16DcjYns2PUHKRTl%2FIHN98oVYCevgK2Rw%3D%3D HTTP/1.1    
Content-Type: application/json;charset=UTF-8    
Connection: keep-alive    
Connection: keep-alive    
Accept: */*    
User-Agent: iPhone11,8(iOS/14.0) Uninview(Uninview/1.0.0) Weex/0.26.0 828x1792    
Content-Length: 1477    
Accept-Language: zh-cn    
Accept-Encoding: gzip, deflate  

使用uni.uploadFile上传的URL:

POST http://domain.com/api/Users/UploadUserPhoto?userId=USERID&appkey=APPKEY&token=F/7jyw7ouOlCJOjg5Lt2Qe+47Y7QCsCzFcrov3INYQRAtVaMz7tSTOOmGT8DdkPWE9spRyWLEyfc+GiF8bhyFfLzBaSGNm2bddMJ666SHB/3scHJCR25P9ok3FhPqDq8fjryPir7TKkveqOS5TtElilq3pbYdEcvQF6BQ+76OPmkWiSHaVeSIRNqvecDw0zmxf7mDO8TZT3/ztR72qbugHEoSYbzDNvoPCuoSsjcJSdOJPNoVXAOd16DcjYns2PUHKRTl/IHN98oVYCevgK2Rw== HTTP/1.1    
Content-Type: multipart/form-data; boundary=io.dcloud.uploader16028650370818    
Connection: keep-alive    
Connection: keep-alive    
Accept: */*    
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Html5Plus/1.0 (Immersed/44) uni-app    
Content-Length: 1257194    
Accept-Language: zh-cn    
Accept-Encoding: gzip, deflate  

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

2 回复

请问解决了吗?

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


这是iOS平台下uni.uploadFile的一个已知问题。在iOS端,uni.uploadFile会对URL中的参数进行自动解码,导致原本编码的字符(如%2F被解码为/,%2B被解码为+,%3D被解码为=)被还原。

从你的请求对比可以看出:

  • 正常请求中token保持编码状态:F%2F7jyw7ouOlCJOjg5Lt2Qe%2B47Y7QCsCzFcrov3INYQRAtVaMz7tSTOOmGT8DdkPWE9spRyWLEyfc%2BGiF8bhyFfLzBaSGNm2bddMJ666SHB%2F3scHJCR25P9ok3FhPqDq8fjryPir7TKkveqOS5TtElilq3pbYdEcvQF6BQ%2B76OPmkWiSHaVeSIRNqvecDw0zmxf7mDO8TZT3%2FztR72qbugHEoSYbzDNvoPCuoSsjcJSdOJPNoVXAOd16DcjYns2PUHKRTl%2FIHN98oVYCevgK2Rw%3D%3D
  • uni.uploadFile请求中token被解码:F/7jyw7ouOlCJOjg5Lt2Qe+47Y7QCsCzFcrov3INYQRAtVaMz7tSTOOmGT8DdkPWE9spRyWLEyfc+GiF8bhyFfLzBaSGNm2bddMJ666SHB/3scHJCR25P9ok3FhPqDq8fjryPir7TKkveqOS5TtElilq3pbYdEcvQF6BQ+76OPmkWiSHaVeSIRNqvecDw0zmxf7mDO8TZT3/ztR72qbugHEoSYbzDNvoPCuoSsjcJSdOJPNoVXAOd16DcjYns2PUHKRTl/IHN98oVYCevgK2Rw==

解决方案:

  1. 将token参数移到formData中(推荐):
uni.uploadFile({  
    url: 'http://domain.com/api/Users/UploadUserPhoto?userId=USERID&appkey=APPKEY',  
    filePath: filePath,  
    formData: {
        key: key,
        token: 'F%2F7jyw7ouOlCJOjg5Lt2Qe%2B47Y7QCsCzFcrov3INYQRAtVaMz7tSTOOmGT8DdkPWE9spRyWLEyfc%2BGiF8bhyFfLzBaSGNm2bddMJ666SHB%2F3scHJCR25P9ok3FhPqDq8fjryPir7TKkveqOS5TtElilq3pbYdEcvQF6BQ%2B76OPmkWiSHaVeSIRNqvecDw0zmxf7mDO8TZT3%2FztR72qbugHEoSYbzDNvoPCuoSsjcJSdOJPNoVXAOd16DcjYns2PUHKRTl%2FIHN98oVYCevgK2Rw%3D%3D'
    },  
    success: res => {  
        if (res.statusCode === 204) {  
            callback(imageUrl)  
        } else {  
            showErrorMessage('图片上传失败')  
        }  
    },  
    fail: res => {  
        showErrorMessage('图片上传失败')  
    }  
})
  1. 使用条件编译针对iOS平台处理
// #ifdef APP-PLUS
if (plus.os.name === 'iOS') {
    // iOS平台需要特殊处理,将token放在formData中
    // 或者对URL进行特殊编码处理
}
// #endif
回到顶部