微信小程序上传文件功能的正确姿势及注意事项

2024-06-19
来源:网络整理

这期间陆续上线了好几个微信小程序,都用到了文件上传功能(头像上传、证件照上传等)。 在通过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.({

分享