uniapp图片上传与压缩,兼容小程序与H5

这篇具有很好参考价值的文章主要介绍了uniapp图片上传与压缩,兼容小程序与H5。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 图片上传借助了Uview2.0的组件
<u-upload :fileList="imgs" :name="" @afterRead="afterRead" :deletable="true" multiple @delete="deletePic" :maxCount="4" width="112rpx" height="112rpx">
    <image src="../../../static/imgs/common/uploadImg.png" mode="widthFix" style="width: 112rpx; height: 112rpx;" :previewFullImage="true"></image>
</u-upload>
<view class="save" @click="$u.throttle(clickSave,500)">保存</view>
<helang-compress ref="helangCompress"></helang-compress> //uniapp插件市场图片压缩工具(https://ext.dcloud.net.cn/plugin?id=2316)
<script>
export default {
    data(){
        return {
                imgs: [],
            },
        }
    },
    methods:{
        // 删除图片
        deletePic(event) {
            this.imgs.splice(event.index, 1)
        },
        // 新增图片
        async afterRead(event) {
            let lists = [].concat(event.file)
            this.imgs = this.imgs.concat(lists.map(item => ({ url: item.url })));
        },
        async clickSave(){
            let updateData =  this.imgs.map(img => img.url)
            uni.showLoading({
                title: '资料上传中...',
                mask: true
            });
            for (let i = 0; i < updateData.length; i++) {
                const img = updateData[i]
                //如果当前的图片地址是以当前域名为开头的,则表示是服务器返回的图片,无需进行处理,否则则是本地图片,需要上传到服务器,在上传之前先对图片进行压缩,压缩与上传之后将本地图片替换成网络图片,这样发给后端的时候,图片地址统一为网络地址形式的图片了
                if (!img.startsWith(config.baseUrl)) {
                    const uploadedUrl = await this.imageUpload(img)
                    updateData.imgs[i] = uploadedUrl
                }
            }
            
            const params = { id: this.id, pay_img: JSON.stringify(updateData) };
            const result = await goodsLink(params);
            uni.hideLoading();
            if(result.code===1){
                this.$u.toast(result.msg, 1000);
                //上传成功的逻辑
            }else{
                this.$u.toast(result.msg)
            }
        },
        //上传图片到服务器,由于微信小程序只支持单文件上传,传多个文件需要反复调用api
        async imageUpload(filePath){
            let originSize
            let finallPath
            //判断本地文件的大小
            uni.getFileInfo({
                filePath: filePath,
                success:({size})=>{
                    originSize = size
                }
            });
            //如果图片小于1M,则不走压缩逻辑,只是转化一下图片的格式,在H5中,图片会由blob转化为文件格式(接口需求)
            if( originSize < 1024*1024){
                finallPath = await exchangeFile(filePath)
            }else{
            //图片大于1M,走压缩
                finallPath = await compressImage.call(this, filePath); // 压缩图片
            }
            const url = config.baseUrl + 'api.php/user/upload_sign_img';
            const token = uni.getStorageSync('user').token;
            //判断当前的平台
            const type = uni.getSystemInfoSync().uniPlatform
            if (type === 'web') {
            //在h5中,使用文件的方式上传
                return new Promise((resolve, reject) => { 
                    uni.uploadFile({
                        url: url,
                        file: finallPath,
                        header:{"AUTHORIZATION": token},
                        fail: err => {
                            reject(err); 
                        },
                        success: res => {
                            const data = JSON.parse(res.data);
                            if (data.data && data.data.file_urls) {
                                const imageUrl = data.data.file_urls;
                                resolve(imageUrl); 
                            } else {
                                reject(data.data); 
                            }
                        },
                    });
                })
            }else{
                return new Promise((resolve,reject)=>{
                    uni.uploadFile({
                    url: url,
                    filePath: finallPath,
                    header:{"AUTHORIZATION": token},
                    name: 'file', 
                    fail: err => {
                        this.$u.toast(err);
                    },
                    success: res => {
                        const data = JSON.parse(res.data);
                        if(data.data && data.data.file_urls){
                            // 上传成功的情况
                            const imageUrl = data.data.file_urls;
                            resolve(imageUrl)
                        }else{
                            this.$u.toast(data.data);
                        }
                    },
                });
            })}
        },
	}
}

</script>
  • 压缩代码
const type = uni.getSystemInfoSync().uniPlatform
// 把blob转为file(h5环境使用)
function dataURLtoFile(dataUrl, filename) {
    const arr = dataUrl.split(',');
    const mime = arr[0].match(/:(.*?);/)[1];
    const bstr = atob(arr[1]);
    let n = bstr.length;
    const u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, { type: mime });
}
function exchangeFile(imageUrl){
    if(type === 'web'){
        imageUrl = dataURLtoFile(imageUrl, 'filename.jpg');
    }
    return new Promise((resolve,reject)=>{
        resolve(imageUrl)
    })
}
//图片压缩处理
async function compressImage(imageUrl) {
    let compressedUrl = imageUrl;
    let count = 0; // 定义一个计数器,用于记录循环次数
    while (count < 5) { // 最多循环5次
        count++; // 对计数器加1
        await new Promise((resolve, reject) => {
            this.$refs.helangCompress.compress({
                src: compressedUrl,
                maxSize: 800,
                fileType: 'jpg',
                quality: 0.85,
                minSize: 640 
            }).then((res) => {
                uni.getFileInfo({
                    filePath: res,
                    success: ({size}) => {
                        console.log(size, '压缩后的文件大小');
                        if (size < 4096 * 1024) { // 小于 4MB,压缩成功
                            console.log('压缩成功');
                            compressedUrl = res; // 更新压缩后的图片路径
                            resolve();
                        } else { // 大于等于 4MB,继续压缩
                            compressedUrl = res; // 更新压缩后的图片路径
                            console.log('再次压缩');
                            resolve();
                        }
                    }
                })
            }).catch((err) => {
                console.log(err);
                reject(err);
            });
        });
        if (compressedUrl) break; // 如果已经成功压缩图片,则退出循环
    }

    if (!compressedUrl) {
        throw new Error('经过5次重试仍无法成功压缩图片');
    }
   
    if(type === 'web'){
        compressedUrl = dataURLtoFile(compressedUrl, 'filename.jpg');
    }
    return compressedUrl;
}
export { exchangeFile, compressImage };

文章来源地址https://www.toymoban.com/news/detail-646459.html

到了这里,关于uniapp图片上传与压缩,兼容小程序与H5的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniApp移动端-H5-微信小程序上传文件(图片,文档和视频等)

    封装了一个插件可直接使用: 插件地址:uniApp移动端-H5-小程序上传文件(图片,文档和视频等),插件可直接用Hbuilderx导入示例项目查看, 实现方法: H5内部是使用uni-app官方内部方法uni.chooseFile 小程序端因hybrid不能使用本地HTML,所以插件提供的是uni-app官方内部方法wx.cho

    2024年02月12日
    浏览(59)
  • uniapp-图片压缩(适配H5,APP)

    uniapp本身是自带压缩图片的方式的,但是他只适用于APP,做不到多端的适配,如果只考虑app,就非常容易实现了。 使用uni.compressImage()这个API即可 要适配H5和APP可以使用canvas的方式进行压缩 原理:按照需求等比例创建空白画布,将图片粘到画布上,最后保存画布的base64流

    2024年02月07日
    浏览(48)
  • uni-app - 头像图片裁剪组件(支持多种裁剪,手势控制旋转或缩放、内外部控制图片移动、提供上传后端接口方案、头像图片美化)全端完美兼容 H5 App 小程序,最好用的图片上传后裁剪插件教程源代码

    网上的教程代码非常乱且都有 BUG 存在,非常难移植到自己的项目中,而且很难。 实现了 完美兼容 H5 App 小程序,选取手机本地相册或拍照,图片上传裁切内置多种方案,样式随便改, 本文代码干净整洁注释详细,您一键复制源码后参照示例几分钟就能完事, 如下图 真机测

    2024年02月17日
    浏览(102)
  • uniapp 上传图片时压缩图片

    提示:这里简述项目相关背景: 最近用uniapp做一个上传图片,要把图片大小压缩到200kb,然后传给后端 image-conversion:一个简单易用的JS图像转换工具,可以指定大小以压缩图像 npm i image-conversion --save const imageConversion = require(“@/components/image-conversion”);

    2024年02月12日
    浏览(38)
  • uniapp 之 多端实现图片压缩(含H5实现)

    compressImage 说明 文档平台差异说明已标出:官网提供的api uni.compressImage 除了 H5 平台,其余平台都支持,所以我们利用条件编译,然后单独处理一下H5的图片压缩即可。 utils.js 里面封装一下该方法,方便调用 封装的这个方法,只是将图片地址返回了,也可以根据具体的实际场

    2024年02月13日
    浏览(69)
  • H5项目中使用微信JS-SDK(以H5项目批量上传图片为例,兼容IOS及安卓)

    H5项目中使用微信图片上传相关sdk,主要用于解决 1.安卓手机无法一次选择多张图片进行上传问题;2.控制IOS系统手机一次可无限量选择图片上传的问题 一、准备工作:公众号配置 验证所需使用的sdk是否符合需求 可在使用场景中,打开微信官方提供的 微信SDKDemo 链接,或企业

    2024年02月07日
    浏览(51)
  • uniapp图片或文件的预览和下载,兼容ios+安卓+浏览器+企业微信H5

    在uniapp的APP日常开发中,我们时常遇到一些兼容性问题,正如本文所提到的图片的预览和下载。在此功能的开发中,我常遇到以下四个问题: 图片预览功能实现,但是PDF,word,xls文件无法打开。 安卓的图片预览和文件查看功能正常,ios系统的手机却问题频出,时不时的无法打

    2023年04月10日
    浏览(49)
  • uniapp下上传图片后图片裁剪加图片旋转,支持H5和app

    效果图 代码如下

    2024年02月15日
    浏览(80)
  • uniapp实现扫码功能兼容小程序和h5

    主要是针对h5端,uniapp自带的扫码方法不支持h5的 对于h5而言需要借助jweixin来实现,也就是微信的扫码功能 实现方式: 可通过npm安装 npm install jweixin-module 引入安装的npm包 import jweixin from \\\'jweixin-module\\\' 在onLoad方法中加载获取签名的方法 onLoad() {             this.wx_sanCode() }

    2024年02月13日
    浏览(45)
  • uniapp多行文本展开或收起(兼容h5、微信小程序,其它未测试)

    文本过短时隐藏按钮,需要知道文本全部展示的行数 文本收起时,微信小程序不能直接获取文本展示的高度 文本展示时,微信小程序不能直接获取文本收起的高度 所以使用 占位文本 获取单行文本高度,最终通过计算得到文本全部展示时的行数 本文介绍的方法兼容h5、微信

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包