问题:
通过uni-app云函数去访问阿里云OSS时,调用list函数[1]
并且使用prefix参数来模拟目录访问时,出现某些前缀下的prefixes和objects均为undefine的问题。
背景:
近期有个小需求,通过uni-app托管在阿里云serveless的js函数,去调用OSS接口,以便于获得类似只读网盘的效果。
由于OSS是对象存储,不存在目录这个概念。所有的文件实际上是平面化管理,但是我们可以通过list函数的两个参数prefix和delimiter去获得模拟目录分组的效果。prefix就是目录名称,delimiter是分隔符,我们分隔符一般都用"/"。
解决
追溯和解决的过程也简单,看看问题是出在uni-app问题上还是阿里云OSS问题上。
首先开一个单独的项目调试了一下ali-oss的nodejs的sdk,直接就发现了问题。
由于上传到oss的文件中有点文件名称是带"+“的,但是在uni-app中,跳转页面会有一个空格转换,url中的空格会被转换为”+",到下一个页面后会将"+“恢复为空格。问题在于参数当中本身就存在”+",无需转换,导致传入的前缀名本身在uni-app的下一页中"+“被改成了空格,再次传入到oss中会发现前缀不存在。因此在通过任何使用url传输的参数时,一定要留意“+”被替换为空格的问题,使用oss的list函数时,如果目录名中存在空格,出现了上述的问题,请在prefix参数上.replace(” “, “+”),将空格手动替换为”+"。
空格转换是任何浏览器在进行url编码时都会做的事情。
浏览器在进行打开和跳转时,会对url进行编码,空格会被编码成"+",然后到下一个页面会自动还原。但是问题来了,有时原本就是加号的内容也会被转回为空格。就导致了之前的问题。
uni-app本身底层使用的仍然是WebView,出现这个问题也是在所难免。我们在浏览器中开发前端页面习惯了这种转换一般会规避,但是由于uni-app封装了很多东西,如果不多作注意,可能会被浏览器原生的特性坑到。
参考资料:
1.^ 阿里云OSS开发文档 列举文件
2.^ uni-app navigateto