uni-app uni.uploadFile在不上传图片时,报TypeError: Cannot read property 'indexOf' of undefined

uni-app uni.uploadFile在不上传图片时,报TypeError: Cannot read property ‘indexOf’ of undefined

测试过的手机

苹果xs,华为P30

示例代码:

uni.uploadFile({
url: configUrl.API_HOST + '/csoi/pm/app/elevationPile/designDatas',
files: images,
fileType: 'image',
formData: this.formValue,
name: 'file',
header: {
'Content-Type': 'multipart/form-data',
Authorization: 'Bearer' + ' ' + token
},
success: uploadFileRes => {}
});

操作步骤:

formData正常上传,不上传图片就会报错

预期结果:

uni.uploadFile在上传图片和不上传图片时都应该像之前的版本一样不报错

实际结果:

新版本不传图片会报错Cannot read property 'indexOf' of undefined;

bug描述:

uni.uploadFile在不上传图片时,报TypeError: Cannot read property 'indexOf' of undefined;
因业务需要,用户上传数据,图片不是必选项,当用户上数据上传一张或以上,能正常上传,但是当用户不上传图片时,uni.uploadFile会报Cannot read property 'indexOf' of undefined,这种情况是我今天更新了hbx和cli出现的。在更新之前,用户不上传照片是不会报错的。麻烦官方看下,是不是升级出了错误,具体代码如下
uni.uploadFile({
url: configUrl.API_HOST + '/csoi/pm/app/elevationPile/designDatas',
files: images,
fileType: 'image',
formData: this.formValue,
name: 'file',
header: {
'Content-Type': 'multipart/form-data',
Authorization: 'Bearer' + ' ' + token
},
success: uploadFileRes => {}
});
其中images数据在有图片时格式为:
[
{
"name": "img0",
"uri": "_doc/uniapp_temp_1632973493543/camera/1632973805767.jpg"
},
{
"name": "img1",
"uri": "_doc/uniapp_temp_1632973493543/camera/1632973810330.jpg"
}
]
无图片格式为:
[
{"uri":"","name":""}
]

更多关于uni-app uni.uploadFile在不上传图片时,报TypeError: Cannot read property 'indexOf' of undefined的实战教程也可以访问 https://www.itying.com/category-93-b0.html

27 回复

上传文件接口必传文件

更多关于uni-app uni.uploadFile在不上传图片时,报TypeError: Cannot read property 'indexOf' of undefined的实战教程也可以访问 https://www.itying.com/category-93-b0.html


问题一是,我在没更新之前都可以不传呢,而且文档files也是说的非必穿啊,问题二,我业务一个form表单,图片本来就是非必传啊,files非必传更灵活一些啊,不然用户不传图片的时候,我还得另外调一次接口?怎么越升级越不好用了啊

回复 谭小谭: 一直未改动,文件上传接口必须上传文件。

回复 DCloud_UNI_GSQ: 我上传了个附件,你看下呢

这不是文档上写的,非必传啊,而且未升级之前,确实是非必传啊,我线上一直在用,这次升级了,就不行了

filePath 呢

回复 DCloud_UNI_GSQ: 你之前在用的版本是多少,回退测试一下

回复 DCloud_UNI_GSQ: 我代码一直都没用filePath哦,直接用的files。我之前主分支的SDK版本为:1.9.9.80859,现在线上都在用,没有问题的。我后面建了个新分支,npm update,并且重新下载了依赖包,就不行了,uni.uploadFile这个方法不传图片就要报错,我自身的业务代码都是没变的,所以我很奇怪为啥升级了,不传图片反而不行了,不科学啊

回复 DCloud_UNI_GSQ: 而且,现在新分支上,我也没用filePath ,只是不传图片会报错,传了图片也是不会报错的,所以和filePath 应该没太大关系吧

回复 DCloud_UNI_GSQ: 而且文档也说了啊,使用 files 时,filePath 和 name 不生效

回复 DCloud_UNI_GSQ: 收假啦,收假啦,麻烦看下问题啦,么么哒

回复 谭小谭: 问:为什么不传不行?答:设计上是必传的。问:为什么之前好的现在不行?答:初期实现可能有不严谨的地方后续实现和设计更接近了。问:后续可能会修改成非必传吗?答:有可能,不过优先级不高,毕竟跨平台兼容性不佳。问:现在怎么处理?答: 无文件时改用方式比如 request 等。

回复 DCloud_UNI_GSQ: 哦了,明明白白

回复 DCloud_UNI_GSQ: 不过还是提个建议,如果代码改动了,文档最好也更新一下,不然按照文档来就行不通

回复 谭小谭: 问:文档描述和接口设计是否相符?答:相符。问:为什么不同人理解的不同?答:后续改进文档描述,争取每个人都能正确理解。

回复 DCloud_UNI_GSQ: 我也遇到了这个问题h5可以上传成功,但是app用uni.uploadfile就提示‘TypeError: Cannot read property ‘indexOf’ of undefined’,传了filePath 也没有用

回复 1***@qq.com: 后来呢咋解决我也遇到了,头疼

回复 1***@qq.com: 后来怎么解决了? 我也遇到了

回复 1***@qq.com: 后来怎么解决了? 我也遇到了

H5可以用,app不行,找了半天我还以为我写错了,妈的,垃圾文档

这问题还没解决吗,上传文件一直报TypeError: Cannot read property ‘indexOf’ of undefined

请问这个问题解决了吗?怎么解决的呢?

回复 y***@163.com: 项目迭代用了uview的上传组件

今天也遇到了,APP没文件死活不行

曲线救国:没有文件时,传空值[{name:’’,uri:’’}]可以

传 [{ name: ‘’, uri: ‘1’ }] 才行,uri为空也报错

这是一个已知的 uni-app 框架问题,在最新版本中确实存在。问题核心在于 files 参数传递了空文件对象时,底层处理逻辑会尝试对 undefined 值执行 indexOf 方法。

临时解决方案:

  1. 条件判断处理:在执行 uni.uploadFile 前,先过滤掉 files 数组中的空文件:
// 过滤掉 uri 为空的文件
const validFiles = images.filter(file => file.uri && file.uri.trim() !== '');

uni.uploadFile({
    url: configUrl.API_HOST + '/csoi/pm/app/elevationPile/designDatas',
    files: validFiles.length > 0 ? validFiles : [], // 确保传递空数组而不是包含空对象的数组
    fileType: 'image',
    formData: this.formValue,
    name: 'file',
    header: {
        'Content-Type': 'multipart/form-data',
        Authorization: 'Bearer' + ' ' + token
    },
    success: uploadFileRes => {}
});
  1. 使用 uni.request 替代:如果不需要上传文件,直接使用 uni.request 提交表单数据:
if (!images.some(file => file.uri && file.uri.trim() !== '')) {
    // 没有有效图片时使用 uni.request
    uni.request({
        url: configUrl.API_HOST + '/csoi/pm/app/elevationPile/designDatas',
        method: 'POST',
        data: this.formValue,
        header: {
            'Content-Type': 'application/json',
            Authorization: 'Bearer' + ' ' + token
        },
        success: res => {}
    });
} else {
    // 有图片时使用 uni.uploadFile
    uni.uploadFile({/* 原配置 */});
}
回到顶部