阿里云小程序直传OSS参考链接:https://help.aliyun.com/document_detail/92883.html?spm=a2c4g.11186623.6.671.4bdd2f08VSVv2v#title-aa7-de0-7tw
以下是记录自己在配置小程序直传阿里云遇到的问题以及解决办法
必备条件:🏁
- Bucket
外网访问 Bucket 域名 也可以是自己绑定oss对应的域名
在OSS的配置中,获取到配置的bucket (在使用host的时候需要做拼接),这个一般是需要我们与阿里云的域名进行拼接的
`https://${Bucket}.oss-cn-beijing.aliyuncs.com`
eg: let Bucket = 'zzfly'
let host = 'https://zzfly.oss-cn-beijing.aliyuncs.com'
- OSSAccessKeyId (可以直接在阿里云服务器的配置信息里面找到)
阿里云 AccessKey ID
- AccessKeySecret:
阿里云 Access Key Secret
一般在公司里面,如果所有资源统一上传至阿里云,获取以上三个参数基本是会使用接口请求回来的。
* 如果是在h5或者web端,只要获取到以上三个参数,那么就可以直接调用阿里云的api `put()` 方法,将文件对象上传到阿里云进行存储。
* 如果是在小程序中直传阿里云,第一次使用可能会遇到很多的坑,下面是一些我在直传阿里云的时候遇到的问题以及解决办法
小程序直传ali-oss问题:
首先,看一下小程序是如何直传阿里云的:
如图:
小程序的直传阿里云,我们利用的是微信的原生apiwx.upLoadFile
,为什么不使用像h5,web端那样的方式,直接调用ali-oss的put()方法进行上传呢?
-
小程序很特殊,它是没有File,Blob这两个内置对象的,所以说,h5和web端上传的路就给我们封死了
-
小程序获取的文件地址是一个临时的地址,如果要上传,我们只能使用它的上传api
wx.upLoadFile()
,具体用法请自行走向官网api手册。
上传之前,先对formData中对几个参数做一个详细的解释:
key:等同于 OSSAccessKeyId,上面已经解释过了
OSSAccessKeyId: 等同于AccessKeySecret,上面已经解释过了
policy:加密规则,那么坑位来了,第一个坑位,就是这个加密规则:
这种东西我刚开始看见的时候一脸懵,一方有难,找八方支援,最后排查到可能是由于h5和web端policy加密规则和signature这个两个引起的,最后,**单独给小程序开了一个ali-oss账户,只需要key和secret,不需要加密规则和签名。**完美解决这个问题 -
success_action_status: 这个是个固定值 200,具体这个是干什么的也没有去深究,能用就行
解决了这个问题,就可以开始上传了,会发现,又会报错,是真的很烦,因为直传阿里云已经做了一周多了,现在才闲下来,才有时间记录问题,我也记不清楚报的什么错了,只记得好像是与证书有关。这个时候,很明显我直接把锅甩给了运维(因为阿里云配置是运维在操作),毕竟是证书,那么肯定就是服务器配置的问题,尴尬的是这口锅没成功甩出去。还砸到自己头上了,排查后发现,我们在使用wx.upLoadFile()
进行文件上传的时候,需要在小程序的公众平台里面配置文件上传域名(文件下载的时候也一样,需要配置下载域名)。
注意:小程序只支持https的协议哦
到此位置,我们就可以完美的上传到阿里云了,上传成功之后,success回调中会返回给我们阿里云的文件地址,就可以进行下一步操作了。
=====================================================================================
当然,正常情况下是上传成功了,又时候也会遇到上传失败的问题,这是真么回事呢?
- 正常情况下,如果一个文件的路径在阿里云中无法找到的时候,是可以允许正常上传的。但是,如果一个图片的地址本身就是阿里云中的地址,这个时候阿里云是不会让再一次上传该图片的,所以会报错,上传失败,就需要咱们在进行图片上传的时候做一个简简单单的过滤操作了哦。
最后附上一份大佬的源码demo地址,大家可以去参考一下:
https://github.com/hujinchen/Image_upload_aliyun