热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

uniapp图片上传与展示

项目场景:uniapp图片上传阿里OSS对象存储需求描述:H5移动端开发中需要用户上传图片头像、身份证件等需求时。需要将图片上传至阿里oss中存储&
项目场景:

uniapp 图片 上传 阿里 OSS 对象存储



需求描述:

H5移动端开发中需要用户上传图片头像、身份证件等需求时。需要将图片上传至阿里oss中存储,并且下载到当前页面进行展示。



解决方案:

代码如下:

需要用到的依赖包:

npm install ali-oss --save

npm install lrz --save

创建一个 upload.js 文件:

const OSS = require("ali-oss"); //引入安装包;
const lrz = require('lrz');//配置 阿里 oss 存储对应的 bucket 桶
var client = new OSS({region: "oss-cn-beijing", //指申请OSS服务时的地域endpoint: "https://oss-cn-beijing.aliyuncs.com", //指定为HTTPS,也可以是IP的形式 region将会被忽略accessKeyId: "xxxxxxxxxxxxxxxxxx", // 填写你的accessKeyIdaccessKeySecret: "xxxxxxxxxxxxxxxxxxxxx", // 填写你的accessKeySecretbucket: "xxxx", // 桶的名称secure: true // 配合region使用。如果指定secure为true,则使用HTTPS访问。
});// 阿里云上传图片// e : 文件对象,filename:存储文件名,tag:识别当前事件的种类,配合fn使用,imgpath:图片路径,fn:回调函数export function uploadImg(e, filename, tag, imgpath, fn) {uni.showLoading({title: '正在上传...'});if (e.tempFiles.length == 0) {uni.hideLoading();uni.showToast({title:'未找到图片',icon:'none'})};// 检测图片大小let file = e.tempFiles[0];if (file.size > 15728640) { // 15M uni.showToast({title: "您上传的图片文件过大,请重新上传!",icon: "none"});return false}lrz(file, {width: 500,}).then(function(res) {let base64 = res.base64;let blob = convertBase64UrlToBlob(base64);let r = Math.random().toString(16).substr(2);let time = new Date(),y, m, d;y = time.getFullYear();m = String(time.getMonth() + 1).length === 2 ? (time.getMonth() + 1) : "0" + (time.getMonth() + 1);d = String(time.getDate()).length === 2 ? (time.getDate()) : "0" + time.getDate();let dfilefold = y + m + d; // 创建时间文件夹let name;if (imgpath.indexOf(filename) != -1) {let tmps = imgpath.split(filename)[1].split('?')[0]; // 获取时间戳name = filename + tmps;} else {name = filename + dfilefold + '/' + r;}// 上传图片client.put(name, blob).then(result => {// 上传成功 ;uni.hideLoading();// 得到图片在oss中的url地址;let path = result.url;fn(tag, path);}).catch(err => {console.log(err)uni.showToast({title: "图上传失败,请重试!",icon: "none"})});})
}// 辅助函数
function convertBase64UrlToBlob(urlData) {var bytes &#61; window.atob(urlData.split(&#39;,&#39;)[1]); //去掉url的头&#xff0c;并转换为byte//处理异常,将ascii码小于0的转换为大于0var ab &#61; new ArrayBuffer(bytes.length);var ia &#61; new Uint8Array(ab);for (var i &#61; 0; i < bytes.length; i&#43;&#43;) {ia[i] &#61; bytes.charCodeAt(i);}return new Blob([ab], {type: &#39;image/png&#39;});
};

在uniapp 项目组件中

<template><view><view><image class&#61;"" :src&#61;"idImage1" mode&#61;"aspectFit" v-if&#61;"idImage1">image><text class&#61;"" style&#61;"font-size: 100rpx;"&#64;tap&#61;"uploadImgfn(&#39;myImage/&#39;, 1, idImage1)" v-else />view><view><image class&#61;"" :src&#61;"idImage1" mode&#61;"aspectFit" v-if&#61;"idImage2">image><text class&#61;"" style&#61;"font-size: 100rpx;"&#64;tap&#61;"uploadImgfn(&#39;myImage/&#39;, 2, idImage2)" v-else />view>......view>
template>

<script>// 引入方法&#xff1b;import {uploadImg} from "../../../utils/upload.js";data() {return {idImage1: " ", // 图片1idImage2:&#39;&#39; &#39;&#39;, // 图片2idImage3:&#39;&#39; &#39;&#39;, // 图片3};},methods&#xff1a;{uploadImgfn(filename, tag, imgpath) {let that &#61; this;// 选择图片uni.chooseImage({success: (res) &#61;> {console.log(res);// 调用方法&#xff0c;上传图片uploadImg(res, filename, tag, imgpath, function(tag, path) {// 展示上传的图片if (tag &#61;&#61; 1) {that.idImage1 &#61; path &#43; "?" &#43; Date.now();} else if (tag &#61;&#61; 2) {that.idImage1 &#61; path &#43; "?" &#43; Date.now();} else if (tag &#61;&#61; 3) {that.idImage3 &#61; path &#43; "?" &#43; Date.now();}})}});},}
</script>



优化部分

感兴趣的小伙伴可以尝试一下封装成Promise对象&#xff0c;这样就用传递回调函数fn&#xff0c;也不用传递tag参数。在.then&#xff08;&#xff09;就可以给idImage进行赋值 url

有更好、更加简洁的方法希望大家能给我提出宝贵的意见或链接。


推荐阅读
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 当使用 `new` 表达式(即通过 `new` 动态创建对象)时,会发生两件事:首先,内存被分配用于存储新对象;其次,该对象的构造函数被调用以初始化对象。为了确保资源管理的一致性和避免内存泄漏,建议在使用 `new` 和 `delete` 时保持形式一致。例如,如果使用 `new[]` 分配数组,则应使用 `delete[]` 来释放内存;同样,如果使用 `new` 分配单个对象,则应使用 `delete` 来释放内存。这种一致性有助于防止常见的编程错误,提高代码的健壮性和可维护性。 ... [详细]
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
  • 通过使用七牛云存储服务,本文详细介绍了如何将本地图片高效上传至云端,并实现了内容的便捷管理。借助七牛云的 Python SDK,文章提供了从认证到文件上传的具体代码示例,包括导入必要的库、生成上传凭证以及处理文件路径等关键步骤。此外,还探讨了如何利用七牛云的 URL 安全编码功能,确保数据传输的安全性和可靠性。 ... [详细]
  • 解决lib-flexible安装过程中遇到的错误问题
    在安装 lib-flexible 时,遇到了 `saveError ENOENT: No such file or directory` 错误,具体表现为无法打开 `E:\Github\SDIO\package.json` 文件。解决此问题的关键在于确保项目根目录下存在 `package.json` 文件,并且在正确的项目路径中执行安装命令。建议先检查项目结构,确认文件是否存在,然后再尝试重新安装依赖。 ... [详细]
  • 本文详细介绍了在 Vue.js 前端框架中集成 vue-i18n 插件以实现多语言支持的方法。通过具体的配置步骤和示例代码,帮助开发者快速掌握如何在项目中实现国际化功能,提升用户体验。同时,文章还探讨了常见的多语言切换问题及解决方案,为开发人员提供了实用的参考。 ... [详细]
  • 在 Vue 项目中,为了提高页面加载速度和优化用户体验,实现图片上传前的压缩处理至关重要。本文介绍了如何通过集成第三方库和自定义组件,有效减小图片文件大小,确保在不影响图像质量的前提下,提升应用性能。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文将详细介绍如何在Webpack项目中安装和使用ECharts,包括全量引入和按需引入的方法,并提供一个柱状图的示例。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • 如何在 Node.js 环境中将 CSV 数据转换为标准的 JSON 文件格式? ... [详细]
author-avatar
手机用户2502853601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有