这期间陆续上线了好几个微信小程序,都用到了文件上传功能(头像上传、证件照上传等)。 在通过APP上传文件到云端的正确方法中,我们介绍了一下我们认为比较安全的上传流程:
密钥保存在服务端,客户端每次都向服务端申请一次性密钥,然后以此作为上传文件的凭证,一般将内容上传到阿里云OSS,阿里云作为容灾。
随着大家安全意识的增强,这个上传流程几乎成了标准姿势。但把这个流程应用到微信小程序上,还有很多细节需要调整。这里我把自己遇到的坑记录下来,希望可以帮助有需要的同学少走弯路。
微信小程序无法直接读取文件内容进行上传
在我们第一版的上传流程解决方案中,我们的CDS签名分发服务只实现了阿里云接口的分发,上传是直接把需要上传的内容以二进制流的形式PUT到云存储中。
但是微信小程序提供的文件上传API需要由以下人员提供文件:
另一方面,微信小程序的JS API目前比较封闭,不能读取文件内容,所以也不可能通过wx直接发起网络请求来实现文件上传。
考虑到wx.本质上是对/form-data网络请求的包装,我们只需要实现一个对应的签发签名方法接口即可。阿里云OSS对应的上传接口是,有拍云对应的是。以阿里云OSS为例,cds服务生成代码如下:
func GetDefaultOSSPolicyBase64Str(bucket, key string) string { policy := map[string]interface{}{ "expiration": time.Now().AddDate(3, 0, 0).Format("2006-01-02T15:04:05.999Z"), "conditions": []interface{}{ map[string]string{ "bucket": bucket, }, []string{"starts-with", "$key", key}, }, } data, _ := json.Marshal(&policy) return base64.StdEncoding.EncodeToString(data) } func GetOSSPostSignature(secret string, policyBase64 string) string { h := hmac.New(sha1.New, []byte(secret)) io.WriteString(h, policyBase64) return base64.StdEncoding.EncodeToString(h.Sum(nil)) }
小程序代码如下:
```
//使用说明
/**
= {
:(降序){
wx.({
图标:“无”,
:降序
})
},
: () {},
:(){
//先存储传递的回调函数
这个。=。;
var 那 = 这个;
wx.({
:1,
:['',''],
:["", ""],
:(分辨率){
那。(res。[0]);
},
失败:(错误){
wx.({
图标:“无”,
: “无法选择图片” + err
})
})
},
//获取阿里上传的图片的签名
: (小路) {
var 那 = 这个;
wx.({
这期间陆续上线了好几个微信小程序,都用到了文件上传功能(头像上传、证件照上传等)。 在通过APP上传文件到云端的正确方法中,我们介绍了一下我们认为比较安全的上传流程:
密钥保存在服务端,客户端每次都向服务端申请一次性密钥,然后以此作为上传文件的凭证,一般将内容上传到阿里云OSS,阿里云作为容灾。
随着大家安全意识的增强,这个上传流程几乎成了标准姿势。但把这个流程应用到微信小程序上,还有很多细节需要调整。这里我把自己遇到的坑记录下来,希望可以帮助有需要的同学少走弯路。
微信小程序无法直接读取文件内容进行上传
在我们第一版的上传流程解决方案中,我们的CDS签名分发服务只实现了阿里云接口的分发,上传是直接把需要上传的内容以二进制流的形式PUT到云存储中。
但是微信小程序提供的文件上传API需要由以下人员提供文件:
另一方面,微信小程序的JS API目前比较封闭,不能读取文件内容,所以也不可能通过wx直接发起网络请求来实现文件上传。
考虑到wx.本质上是对/form-data网络请求的包装,我们只需要实现一个对应的签发签名方法接口即可。阿里云OSS对应的上传接口是,有拍云对应的是。以阿里云OSS为例,cds服务生成代码如下:
func GetDefaultOSSPolicyBase64Str(bucket, key string) string { policy := map[string]interface{}{ "expiration": time.Now().AddDate(3, 0, 0).Format("2006-01-02T15:04:05.999Z"), "conditions": []interface{}{ map[string]string{ "bucket": bucket, }, []string{"starts-with", "$key", key}, }, } data, _ := json.Marshal(&policy) return base64.StdEncoding.EncodeToString(data) } func GetOSSPostSignature(secret string, policyBase64 string) string { h := hmac.New(sha1.New, []byte(secret)) io.WriteString(h, policyBase64) return base64.StdEncoding.EncodeToString(h.Sum(nil)) }
小程序代码如下:
```
//使用说明
/**
= {
:(降序){
wx.({
图标:“无”,
:降序
})
},
: () {},
:(){
//先存储传递的回调函数
这个。=。;
var 那 = 这个;
wx.({
:1,
:['',''],
:["", ""],
:(分辨率){
那。(res。[0]);
},
失败:(错误){
wx.({
图标:“无”,
: “无法选择图片” + err
})
})
},
//获取阿里上传的图片的签名
: (小路) {
var 那 = 这个;
wx.({
这期间陆续上线了好几个微信小程序,都用到了文件上传功能(头像上传、证件照上传等)。 在通过APP上传文件到云端的正确方法中,我们介绍了一下我们认为比较安全的上传流程:
密钥保存在服务端,客户端每次都向服务端申请一次性密钥,然后以此作为上传文件的凭证,一般将内容上传到阿里云OSS,阿里云作为容灾。
随着大家安全意识的增强,这个上传流程几乎成了标准姿势。但把这个流程应用到微信小程序上,还有很多细节需要调整。这里我把自己遇到的坑记录下来,希望可以帮助有需要的同学少走弯路。
微信小程序无法直接读取文件内容进行上传
在我们第一版的上传流程解决方案中,我们的CDS签名分发服务只实现了阿里云接口的分发,上传是直接把需要上传的内容以二进制流的形式PUT到云存储中。
但是微信小程序提供的文件上传API需要由以下人员提供文件:
另一方面,微信小程序的JS API目前比较封闭,不能读取文件内容,所以也不可能通过wx直接发起网络请求来实现文件上传。
考虑到wx.本质上是对/form-data网络请求的包装,我们只需要实现一个对应的签发签名方法接口即可。阿里云OSS对应的上传接口是,有拍云对应的是。以阿里云OSS为例,cds服务生成代码如下:
func GetDefaultOSSPolicyBase64Str(bucket, key string) string { policy := map[string]interface{}{ "expiration": time.Now().AddDate(3, 0, 0).Format("2006-01-02T15:04:05.999Z"), "conditions": []interface{}{ map[string]string{ "bucket": bucket, }, []string{"starts-with", "$key", key}, }, } data, _ := json.Marshal(&policy) return base64.StdEncoding.EncodeToString(data) } func GetOSSPostSignature(secret string, policyBase64 string) string { h := hmac.New(sha1.New, []byte(secret)) io.WriteString(h, policyBase64) return base64.StdEncoding.EncodeToString(h.Sum(nil)) }
小程序代码如下:
```
//使用说明
/**
= {
:(降序){
wx.({
图标:“无”,
:降序
})
},
: () {},
:(){
//先存储传递的回调函数
这个。=。;
var 那 = 这个;
wx.({
:1,
:['',''],
:["", ""],
:(分辨率){
那。(res。[0]);
},
失败:(错误){
wx.({
图标:“无”,
: “无法选择图片” + err
})
})
},
//获取阿里上传的图片的签名
: (小路) {
var 那 = 这个;
wx.({