微信JSSDK接口 - 图片上传、下载

微信JSSDK接口 - 图片上传、下载

 

刚刚做微信上传、下载图片功能的开发,网上得知微信不支持网页上传图片的功能。但是,微信JS-SDK说明文档提供一系列接口用来实现图片上传、预览及下载,其中uploadImage接口用于上传图片,一般和chooseImage接口配合使用,previewImage接口用于预览图片。

 

由于uploadImage一次只能上传一张图片,因此当用户选择多张图片时,需等前一张图片上传之后再调用该接口,也就是说,如果想要上传多张图片,需要将并行上传改成串行。

 

具体步骤如下:

1、页面加载时需要得到appId、timestamp、nonceStr、signature四个值用来进行权限验证,验证通过后才能上传图片。建议值从后台传入,具体方法参照"微信JSSDK接口-生成签名"

2、点击页面"上传图片"按钮调用uploadImg方法

(1)首先,调用chooseImage接口返回本地图片的localIds列表

(2)之后,调用uploadImage接口返回图片的服务器端serverIds列表

3、得到图片的服务器端serverIds,传到后台用来获取图片(在form表单中设置隐藏input标签,将serverIds值传到后台)

4、后台根据serverIds以及access_token(生成签名时的所使用的调用接口凭证),调用微信"下载多媒体文件"接口获取图片做后续备份、存储

 

    图片上传

<!DOCTYPE html>
<html>
<head>
    <!--如果页面启用了HTTPS,请务必额外引用第二条JS-->
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <title>上传图片</title>
</head>
<body>
    <div class="weui_uploader_input_wrp">
        <input type="button" οnclick="uploadImg()" value="上传图片">
    </div>
    <g:form name="myForm" action="myAction">
        <input type="hidden" name="serverIds" id="serverIds" value=""/>
        <input type="button" value="提交"/>
    </g:form>
</body>
</html>

  

<script>
    var appId = ""      // 微信平台唯一标识
    var timestamp = ""  // 生成signature所使用的timestamp
    var nonceStr = ""   // 生成signature所使用的nonceStr
    var signature = ""  // 数字签名,生成参照:微信JSSDK接口 - 生成签名
    
    // 后台生成的signature所使用的url应该和它相同
    // alert(location.href.split('#')[0])
    wx.config({
        debug: false,
        appId: appId,
        timestamp: timestamp,
        nonceStr: nonceStr,
        signature: signature,
        jsApiList: [
              "chooseImage", "previewImage", "uploadImage", "downloadImage"
        ]
    });

    var serverIds = ""
    function uploadImg() {
        wx.chooseImage({
            count: 9,
            sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album', 'camera'],      // 可以指定来源是相册还是相机,默认二者都有
            success: function (res) {
                var localIds = res.localIds;      // 返回选定照片的本地ID列表
                syncUpload(localIds);             // localId可作为img标签的src属性显示图片
            }
        });
    }

    function syncUpload(localIds) {
        var localId = localIds.pop();
        wx.uploadImage({
            localId: localId,                // 需要上传的图片的本地ID,由chooseImage接口获得
            isShowProgressTips: 1,           // 默认为1,显示进度提示
            success: function (res) {
                var serverId = res.serverId; // 返回图片的服务器端serverId
                serverIds = serverIds + serverId + ",";
                $("#serverIds").val(serverIds);
                if(localIds.length > 0){
                    syncUpload(localIds);
                } else {
                    alert("图片上传成功")
                }
            }
        });
    };
</script>

 

图片下载

 

def uploadImage(String accessToken, String server_id)
{
    String requestUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=${accessToken}&media_id=${server_id}"
    URL url = new URL(requestUrl)
    HttpURLConnection conn = (HttpURLConnection) url.openConnection()
    conn.setDoInput(true)
    conn.setRequestMethod("GET")
    def fileType = conn.getHeaderField("Content-Type").split("/")[-1]
    BufferedInputStream bis = new BufferedInputStream(conn.getInputStream())
    
    File tempFile = new File("images/wxTempFile.${fileType}")
    FileOutputStream fos = new FileOutputStream(tempFile)
    byte[] buf = new byte[1024 * 1024]
    int size = 0
    while ((size = bis.read(buf)) != -1)
    {
        fos.write(buf, 0, size)
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信jssdk是一种用于在网页中调用微信功能的开发工具包。其中,获取位置是其中的一个功能之一。当在调用微信jssdk获取位置接口时,如果出现获取位置失败,签名错误的情况,可能是以下几个原因所导致: 1. 签名错误:在调用获取位置接口前,需要对相关参数进行签名验证,以确保数据的完整性和安全性。签名错误可能是由于签名算法实现错误、调用接口时传入的参数错误或者服务器时间戳与微信服务器时间戳不一致等原因所导致。解决方法是检查签名算法是否正确,参数是否正确传递,并确保服务器时间戳与微信服务器时间戳一致。 2. 接口权限问题:在申请微信jssdk使用权限时,需要在公众号设置中配置相关权限。如果没有正确配置接口权限,则无法调用获取位置接口,会出现获取位置失败的情况。解决方法是检查公众号设置中的权限配置,确保获取位置接口的权限被正确开启。 3. 用户拒绝授权:在用户使用网页时,系统会通过微信弹出授权窗口,询问用户是否允许获取位置信息。如果用户选择拒绝授权,则无法获取位置信息,从而导致获取位置失败的情况。解决方法是在用户拒绝授权后,提示用户重新授权,或者提供其他方式获取位置信息。 总之,当微信jssdk获取位置失败,签名错误时,需要仔细检查签名算法、参数传递和接口权限配置等方面的问题,并根据具体情况进行相应的调整和处理。 ### 回答2: 微信jssdk是一个用于在网页中调用微信接口的开发工具包。在使用jssdk时,通过wx.config方法来进行配置,并且在配置的过程中需要传入一个参数:签名(signature)。 签名是基于一定算法生成的,用于验证消息的真实性和完整性。当微信jssdk获取位置失败并且报错签名错误时,可能是由以下几个原因造成的: 1. 签名生成错误:签名的生成过程中可能出现错误,导致最终生成的签名不正确。这可能是由于服务端生成签名的算法或参数配置有误,需要检查签名生成代码并修正错误。 2. 参数传递错误:在传递签名参数时,可能存在传递错误的情况。签名参数包括appId、timestamp、nonceStr、signature,这些参数需要按照规定的格式传递给wx.config方法。需要仔细检查参数传递的过程,确保参数的准确性和完整性。 3. SSL证书问题:微信要求在调用jssdk时使用HTTPS协议,并且需要使用有效的SSL证书。如果网页没有配置有效的SSL证书,那么在获取位置时会报错签名错误。需要确保网页使用HTTPS协议,并且配置了有效的SSL证书。 解决以上问题的步骤为: 1. 检查签名生成代码,确认生成签名的算法和参数没有错误; 2. 检查参数传递过程,确保传递给wx.config方法的参数准确无误; 3. 确认网页使用了HTTPS协议,并配置了有效的SSL证书; 4. 在修改代码后,重新测试获取位置功能,如果问题仍然存在,可以参考微信官方文档或寻求微信开发者论坛的帮助。 ### 回答3: 微信 JSSDK 是一种用于开发微信公众号的前端开发工具包,它提供了丰富的接口和功能,方便开发者构建丰富的微信公众号应用。当使用 JSSDK 中的定位功能时,获取位置失败并出现签名错误的问题可能是由以下几个原因引起的。 1. 网络问题:在使用微信 JSSDK 时,要求设备能够连接到互联网,如果网络不稳定或者设备无法连接到互联网,就可能导致定位功能失败。请确保设备有稳定的网络连接。 2. 位置权限:微信 JSSDK 需要用户授权才能获取设备的位置信息。如果用户拒绝了位置权限请求,那么就无法获取到位置信息。在使用定位功能前,应该向用户请求位置权限,并在用户授权后才能使用。 3. 未配置有效的签名:微信 JSSDK 需要在后台进行配置并生成签名,用于验证请求的合法性。如果签名错误,就无法正确获取位置信息。在生成签名时,需要保证参数的正确性,包括参数的顺序、大小写等。请仔细检查签名生成的代码逻辑和参数配置是否正确。 4. 使用的 API 接口不支持:微信 JSSDK 提供了多个获取位置的接口,不同的接口可能有不同的要求和适用场景。如果使用的接口与当前场景不匹配或者不支持当前设备的操作系统版本,可能会导致获取位置失败。请确认使用的接口与当前场景的要求是匹配的。 综上所述,当微信 JSSDK 获取位置失败并出现签名错误时,可能是网络问题、位置权限、签名配置或使用的接口不正确导致的。在解决问题时,可以逐一排查以上原因,并根据具体情况进行相应的调试和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值