移动端图片上传的两种方式

前段时间一直在做公司的项目,开发中遇到了图片上传的功能,由于是第一次调用微信接口实现多图上传,处处是坑啊,现总结一下开发中的问题,分享出来,以便后续有类似功能时直接查看使用,不必两眼一抹黑的开发了。
一 基于微信提供的API开发多图上传
(1) 微信js-sdk有两种,我们在开发中需要搞清楚自己到底是调用哪个平台的接口,两种sdk大同小异
一种是我们平时使用的js-sdk(微信JS-SDK说明文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115)
另一种就是企业号开发的sdk
(企业号开发者中心:http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BE%AE%E4%BF%A1JS-SDK%E6%8E%A5%E5%8F%A3#.E5.9B.BE.E5.83.8F.E6.8E.A5.E5.8F.A3)
(2)配置相关
在我们使用sdk前,需要在后台配置我们项目打包上线后需要用的可信域名(即:JS接口安全域名),配置该域名时会随机生成一个txt文件,我们需要将该文件放置在网站的根目录下并且确保能访问,否则的话我们是调用不了各接口的,接下来就是根据官方文档提供的步骤配置config。
config接口注入权限验证配置中的签名串(signature)需要注意的是url参数,在安卓手机上该参数是当前页面的URL地址,但是在ios上,是用进入页的url去参与签名,所以会一直报签名失败,对于单页应用的Vue来说,我们需要再调用各接口的时候先刷新下页面获取到正确的URL后再去做签名算法,这是我们在开发中需要多加注意的。
(3)图片上传操作
1 调用拍照或从手机相册中选图接口
wx.chooseImage({
count: 1, // 默认9
sizeType: [‘original’, ‘compressed’], // 可以指定是原图还是压缩图,默认二者都有
sourceType: [‘album’, ‘camera’], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
}
});
2 上传图片接口
wx.uploadImage({
localId: ”, // 需要上传的图片的本地ID,由chooseImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回图片的服务器端ID,这是微信服务器的图片ID
// 调用自己的接口实现上传数据
}
});
备注:上传图片有效期3天,可用微信多媒体接口下载图片到自己的服务器,此处获得的 serverId 即 media_id。
虽然我们选择了多张图片,但是在上传的时候微信不支持把所选图片一次性上传,所以最终还是得一张一张上传,因此需要一个递归函数去多次执行
3 将上传的图片从微信服务器下载到自己的服务器上,这里需要使用素材管理中的获取临时素材接口
http请求方式: GET,https调用
https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
企业号开发该接口地址:
https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
这里的操作需要在后端实现,该接口返回的是一个供下载的图像流,我们可以请求该地址,将返回内容直接写入本地服务器就是一个图片,然后可以返回一个供前端使用的图片地址,前端就可以展示了。但是这样又增加了一次请求,体验性不是很好。

改进方法:既然图片是从本地获取到的,我们可以考虑直接使用上述1中返回的localIds展示本地图片,对于增加、删除操作,我们只需要将服务器返回地址与localIds相关联就可以解决,这样的话减少了http请求并且能够快速显示出所选图片来,何乐而不为呢。

到这以为图像的上传跟展示已经完事了,但是。。。,可怕的但是出现了

在ios下,localIds无法作为img的src显示,需要调用专门为iOS准备的获取本地图片接口(wx.getLocalImgData)
wx.getLocalImgData({
localId: ”, // 图片的localID
success: function (res) {
var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
}
});
此处的localId是一个图片的id,不可把localIds一次传入,所以还是需要自己写个递归函数多次调用

到此,基于微信的多图上传告一段落

二 使用megapix-image 实现移动端图片上传

该插件原理是使用Canvas压缩图片上传,使用该插件的大体思路是
1 页面初始化一个input标签跟一个img标签,input标签用来获取选择的图片资源,其内容存放在document.getElementById(‘inputid‘).files[0]中,img标签用来展示选择的图片的base64码
2 构造一个MegaPixImage函数
eg: mpImg = new MegaPixImage(file);,file即为document.getElementById(‘inputid‘).files[0]
MegaPixImage有一个render方法,该方法接受几个参数,第一个参数:img标签,第二个参数是一个对象:可以设置图像的大小跟压缩比{maxHeight: 500,maxWidth: 500, quality: 0.6}, 第三个参数是回调函数,回调函数默认参数是图片的base64码

例:
var fileInput = document.getElementById(‘cameraInput‘);
var file = fileInput.files[0];
var mpImg = new MegaPixImage(file);

        var resCanvas1 = document.getElementById(‘myCanvas‘);
        var _max = 320;
        mpImg.render(resCanvas1, {
            maxHeight: _max
        },callback);

callback中便可以写自己的业务逻辑代码。
3 服务端处理
服务端获取到base64 码,将以 “data:image/png;base64,”开头的字符串截取后的剩余字符串写入文件,即是一张可打开的图片,然后返回前端成功标志,前端便可以按照约定好的路径格式读取文件了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移动上实现图片可以使用HTML5的File API和FormData来实现。下面是一个简单的示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>移动图片</title> </head> <body> <input type="file" accept="image/*" id="uploadInput"> <button onclick="upload()">上</button> <script> function upload() { var fileInput = document.getElementById('uploadInput'); var file = fileInput.files[0]; if (file) { var formData = new FormData(); formData.append('image', file); // 发送HTTP请求进行上,这里可以使用Ajax或者fetch等方式 // 这里只是一个示例,上的请求地址和方法需要根据具体情况进行修改 fetch('http://example.com/upload', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { // 处理上成功后的逻辑 console.log('上成功', data); }) .catch(error => { // 处理上失败后的逻辑 console.error('上失败', error); }); } } </script> </body> </html> ``` 上述代码中,我们创建了一个文件选择框(input type="file")和一个上按钮,当用户选择文件后,点击上按钮会触发`upload()`函数。 在`upload()`函数中,我们获取到用户选择的文件,并创建一个FormData对象,将选择的文件添加到FormData中。然后使用Ajax或者fetch等方式将FormData发送到服务器进行上。 请注意,这只是一个简单示例,实际场景中需要根据具体需求进行修改和完善,比如加入文件大小校验、文件类型校验、上进度显示等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值