微信端调取相册和摄像头功能,实现图片上传,并上传到服务器

最近在做微信公众号网页开发,遇到两个需要用到微信的JSSDK,上传图片和自动定位,微信开发者文档有详细的步奏内容,链接点击进入微信开发者文档 ,也可以看看我这篇文章,看我是如何实现的。

首先第一步,需要在页面引入微信的JS文件(http和https都行)

<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

第二步,获取签名

后台会给前端一个接口,前端通过这个接口发送请求获取必要的签名信息,并进行配置

sendAjax.weixin.getSdkSign({'传入参数'},function(msg){
    let sdkSign = msg.sdkSgin; // 后台返回的值
      wx.config({
        debug: false, // 因为在手机上测试没法打印,当debug为true时,所有的返回值都会在手机上alert出来
        appId: sdkSign.appId, // 必填,公众号唯一标识
        timestamp: sdkSign.timestamp, // 必填,生成签名的时间戳
        nonceStr: sdkSign.nonceStr, // 必填,生成签名的随机串
        signature: sdkSign.signature,// 必填,签名
        jsApiList: ['chooseImage','uploadImage'] // 必填,需要使用的JS接口列表,需要用到什么接口就去开发者文档查看相应的字段名
      });
});

其中,sendAjax.weixin.getSdkSign 是我个人自己封装的ajax请求,不用多在意。

第三步,就是上传图片了,相信一般都是一个点击事件来调取微信的相册和摄像头功能。在事件方法中按以下方式写

wx.chooseImage({
        count: 1, // 最多可以选择的图片张数,默认9
        sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有
        sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有
        success: function (res) {
          let localIds = res.localIds; // 返回选定照片的本地ID列表(手机上操作就是手机端的ID列表,是一个数组),localId可以作为img标签的src属性显示图片
          wx.uploadImage({
            localId: localIds[0], // 需要上传的图片的本地ID,由chooseImage接口获得
            isShowProgressTips: 1, // 默认为1,显示进度提示
            success: function (result) {
              let serverId = result.serverId; // 返回图片的服务器端ID
              // 可以将serverId传给后台,用于存放在自己服务器上
            }
          });
        },
        fail: function() {},
        complete: function() {}
});

需要注意的是,chooseImage是调取微信相册和摄像头功能。其中count是可选择的,localIds是一个数组,当只上传一张图片时,localIds[0]可直接用来作为需要上传图片位置的路径,不用再拼接其他东西。

uploadImage是将本地图片上传到服务器,至于怎么上传,这应该是后端的事了,你只需要保证localIds这个数组正确即可。

 

至此,微信端调取相册和摄像头功能,实现图片上传,并上传到服务器功能基本就实现了,有疑问或者不对的地方欢迎留言。

 

 

实现这个功能需要分为两步:1)调用系统相册,选择图片;2)将图片上传服务器。下面是一个基本的实现思路: 1. 调用系统相册,选择图片 在Android中,可以通过`Intent`来启动系统相册: ```java Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, PICK_IMAGE_REQUEST); ``` 上面的代码将会打开系统相册,用户可以选择一张图片。其中`PICK_IMAGE_REQUEST`是一个自定义的整数值,用于后续处理。 然后在`onActivityResult`方法中处理选择的图片: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { Uri uri = data.getData(); // 处理选择的图片 ... } } ``` 在上面的代码中,我们从`data`中获取了选择的图片的URI,然后可以在后续的步骤中使用它。 2. 将图片上传服务器图片上传服务器需要使用网络请求。可以使用`OkHttp`或`Volley`等网络库来实现。以下是一个使用`OkHttp`实现上传的示例代码: ```java private void uploadImage(Uri uri) { // 创建OkHttpClient OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .build(); // 创建RequestBody RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("image", "image.png", RequestBody.create(MediaType.parse("image/png"), new File(getRealPathFromURI(uri)))) .build(); // 创建请求 Request request = new Request.Builder() .url("https://example.com/upload") .post(requestBody) .build(); // 发送请求 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理请求失败 } @Override public void onResponse(Call call, Response response) throws IOException { // 处理请求成功 } }); } // 获取图片在本地的真实路径 private String getRealPathFromURI(Uri uri) { String[] projection = {MediaStore.Images.Media.DATA}; CursorLoader loader = new CursorLoader(getApplicationContext(), uri, projection, null, null, null); Cursor cursor = loader.loadInBackground(); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } ``` 在上面的代码中,我们使用`MultipartBody`来创建一个带有图片数据的请求体,然后使用`OkHttpClient`来发送请求。`getRealPathFromURI`方法用于获取选择的图片在本地的真实路径。 需要注意的是,上面的代码只是一个简单的示例,实际应用中需要根据具体情况进行修改。 另外,上传图片到服务器可能需要进行身份验证等操作,具体实现需要根据服务器的要求进行修改。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值