基于Vue和uni-app实现手机app的功能实现和打包。拍照功能和选取本地图片使用的是HTML5的API 实现。

我为测试这个功能使用node写了个本地服务器,对于手机调试,可以通过连接同一个无线网访问对应的地址进行测试。

选取本地图片

gallery

Gallery模块管理系统相册,支持从相册中选择图片或视频文件、保存图片或视频文件到相册等功能。通过plus.gallery获取相册管理对象。

gallery有两个方法: pick 和 save 通过名称可知一个是选择图库文件一个是保存到图库中,这里只使用了 pick 方法。

void plus.gallery.pick(successCB, errorCB, options);
// 从相册中选择图片
function galleryImg() {
// 从相册中选择图片
console.log("从相册中选择图片:");
plus.gallery.pick( function(path){
// 返回的路径等会上传的时候要用
console.log(path);
}, function ( e ) {
// 失败的回调函数
console.log( "取消选择图片" );
}, {
// 图片获取的选项 // 图库文件过滤选项
filter:"image", } );
}
// 从相册中选择多张图片
function galleryImgs(){
// 从相册中选择图片
console.log("从相册中选择多张图片:");
plus.gallery.pick( function(e){
for(var i in e.files){
console.log(e.files[i]);
}
}, function ( e ) {
console.log( "取消选择图片" );
},{
filter:"image",
// 是否可以多选
multiple:true,
// 设定最多可选取数量
maximum:3,
// 是否使用系统相册文件选择界面
system:false,
// 当超过设定的选取数量触发的事件
onmaxed:function(){
plus.nativeUI.alert('最多只能选择3张图片');
}
});
}
  // 获取相册图片
// 从相册中选择多张图片
galleryImgs(url, imgMaxNum) {
// 从相册中选择图片
console.log('从相册中选择多张图片:')
plus.gallery.pick(function (e) {
// 成功回调
console.log(e)
// 如果选取成功则执行上传功能
// 创建任务
// 返回以upload对象
let task = plus.uploader.createUpload(url,
{
method: 'POST',
// 上传任务每次上传的文件块大小(仅在支持断点续传的服务有效)
// 数值类型,单位为Byte(字节),默认值为102400,若设置值小于等于0则表示不分块上传
blocksize: 10000000000000000000000000,
// 上传任务的优先级,数值类型,数值越大优先级越高,默认优先级值为0。
priority: 100,
// 上传任务超时时间
timeout: 51000
},
// 完成函数,成功失败都会调用次函数
function (t, status) {
// 上传完成
if (status == 200) {
// 上传成功返回url
alert('Upload success: ' + t.url)
} else {
alert('Upload failed: ' + status)
}
}
) // 遍历添加文件
for (var i in e.files) {
// 使用图片选取后返回的文件路径
// param 1添加上传文件的路径
// param2 可通过此参数设置上传任务属性,如文件标识、文件名称、文件类型等, key如果重复会导致上传失败
// 函数返回一个布尔值,代表添加文件成功与否
task.addFile(e.files[i], { key: 'ducha' + i + Math.random() * 10 })
} // 添加上传数据
if (imgType !== undefined) {
task.addData('IMG_TYPE', imgType)
}
task.start() }, function (e) {
// 失败回调
console.log('取消选择图片')
},
{
// options
filter: 'image',
// 多选
multiple: true,
// 是否调用手机终端自带的相册页面
system: true,
maximum: imgMaxNum || '',
onmaxed: function () {
plus.nativeUI.alert('最多只能选择' + imgMaxNum + '张图片')
}
})
}

拍照

camera

Camera模块管理设备的摄像头,可用于拍照、摄像操作,通过plus.camera获取摄像头管理对象。

它具有一个方法 getCamera

// 返回一个摄像头管理对象,只有需要拍照和录像功能需要先获取此对象才行

// index 表示摄像头,1默认摄像头(主摄像头),2表示副摄像头

Camera =  plus.camera.getCamera( index )

Camera 摄像头管理对象具有三个方法,分别是获取拍照功能 captureImage 和获取录像功能 startVideoCaputer  和停止录像功能 stopVideoCaputer 。
   我们使用 captureImage 方法进行拍照功能的实现。

功能具有拍照,压缩,上传功能


/**
*
* @param {上传的url} url
* @param {上传后得到的回调} callback
* @param {上传失败的回调} errBack
*/
function camera(url, callback, errBack) {
// 获取到camera
let cmr = plus.camera.getCamera();
// 调用cmr的captureImage方法进行拍照功能的调用
cmr.captureImage(function() {
// 成功回调
// 通过resolveFileSystemURL 获取真实地址
plus.io.resolveLocalFileSystemURL(e, function(entry) {
let imgUrl = entry.toLocalURL();
let imgName = new Date().valueOf();
let imgSuffix = imgUrl.substr(e.lastIndexOf('/') + 1); // 进行压缩
plus.zip.compressImage(
{
src: imgUrl,
// 压缩后图片的路径
dst: '_doc/' + imgName + imgSuffix,
overwrite: true,
quality: 50,
// 高度可以根据自己的需求设定
height: '100px'
},
function(event) {
// 压缩成功回调
let target = event.target;
// 调用上传组件
upload(url, target, callback, errBack);
},
function() {
// 失败回调
}
);
});
});
} /**
*
* @param {上传的url} url
* @param {用来上传的图片地址} target
* @param {上传后得到的回调} callback
* @param {上传失败的回调} errBack
*/
function upload(url, target, callback, errBack) {
var task = plus.uploader.createUpload(
url,
{
method: 'POST',
blocksize: 888888,
priority: 100,
timeout: 51000
},
function(data, status) {
// 上传完成
if (status === 200) {
return callback(data.responseText);
} else {
errBack(data);
}
}
);
task.addFile(target, {
key: 'a' + Math.random() * 10
});
task.start();
}
图片预览功能

使用vue-image-swiper实现一个预览页面

<template>
<div class="camera">
<my-header :title="title" class="xxxxx"></my-header>
<div class='camera-list'>
<ul class="show-list">
<li
:key="index"
@click="preview(index)"
class='add-btn'
v-for="(l, index) in imageUrl">
<img :src="l" alt="">
</li>
<li
class="add-btn"
@click="openGetImage"
>
<van-icon name="plus"/>
</li>
</ul>
</div>
<actionsheet ref="actionsheet" :data="actionsheetData" @change="actionsheetChange" class="select"></actionsheet>
</div>
</template> <script>
import MyHeader from 'my-header'
import Actionsheet from 'actionsheet'
import {camera, pick} from 'getImages' export default {
name: 'camera',
data() {
return {
title: '图片上传',
imageUrl: [],
actionsheetData: [
{
'id': '1',
'name': '拍照'
},
{
'id': '2',
'name': '相册'
}
],
}
},
methods: {
preview(index) {
this.$imagePreview({
images: this.images,
index: index
})
},
openGetImage() {
this.$refs.actionsheet.show()
},
// 弹出标签
actionsheetChange(item) {
if (item.id === '1') {
this.getImage()
} else if (item.id === '2') {
this.appendByGallery()
}
},
addImg(data) {
let imgs = data.IMG_URL.split(',')
for (let i in imgs) {
imgs[i] = wwwBase + imgs[i]
}
let ids = data.IMG_ID.split(',')
this.imageId = this.imageId + ',' + ids
// this.SaveImgId(this.imageId)
this.SaveImgId('3333')
// this.formDataShow.IMG_ID = this.formDataShow.IMG_ID.concat(ids)
// this.formDataShow.IMG_URL = this.formDataShow.IMG_URL.concat(imgs)
// this.formData.IMG_ID = this.formDataShow.IMG_ID.join()
this.imageUrl = [...this.imageUrl, imgs]
},
// 上传失败的统一错误回调
errorBack(err) {
alert(err)
},
getImage() {
// 拍照
let that = this
camera(url, function (res) {
res = JSON.parse(res)
that.addImg(res.data)
}, this.errorBack, '1')
},
appendByGallery() {
// 相册
let that = this
pick(url, function (res) {
res = JSON.parse(res)
that.addImg(res.data)
}, this.errorBack, '1')
}
},
components: {
MyHeader,
Actionsheet
}
}
</script>

关于后端的服务器和整体项目

全部会上传到github上,可以直接clone下来进行查看。

在Vue中实现app拍照-选取本地图库-图片上传成功后预览的更多相关文章

  1. Asp.net中FileUpload控件实现图片上传并带预览显示

    单一图片上传——“选择”+“上传”,.NET默认模式: 1.实现原理:     采用FileUpload控件默认的使用方式,先由“选择”按钮选择图片,然后单击“上传”按钮完成上传,并可在“上传”按钮的 ...

  2. vue项目富文本编辑器vue-quill-editor之自定义图片上传

    使用富文本编辑器的第一步肯定是先安装依赖 npm i vue-quill-editor 1.如果按照官网富文本编辑器中的图片上传是将图片转为base64格式的,如果需要上传图片到自己的服务器,需要修改 ...

  3. HTML5 Plus 拍照或者相册选择图片上传

    HBuilder+HTML5 Plus+MUI实现拍照或者相册选择图片上传,利用HTML5 Plus的Camera.Gallery.IO.Storage和Uploader来实现手机APP拍照或者从相册 ...

  4. LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android

    LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android jincon 发表于 2015-02-26 18:31:01 发表在: php开发 localresiz ...

  5. 移动端h5拍照压缩即时上传后台并预览

    项目经理让迭代一个功能,实时预览并上传到后台的功能,听到这立马想起了几个第三方插件去实现,mui  和api cloude万万没想到的是这个app前面使用ios 和安卓原生写的,然后mui和api c ...

  6. IOS网络第五天 AFN-02-文件上传,底部弹出窗体,拍照和相册获取图片上传

    ************** #import "HMViewController.h" #import "AFNetworking.h" @interface ...

  7. vue富文本编辑器vue-quill-editor使用总结(包含图片上传,拖拽,放大和缩小)

    vue-quill-editor是vue很好的富文本编辑器,富文本的功能基本上都支持,样式是黑白色,简洁大方. 第一步下载 vue-quill-editor: npm i vue-quill-edit ...

  8. 微信开发中使用微信JSSDK和使用URL.createObjectURL上传预览图片的不同处理对比

    在做微信公众号或者企业微信开发业务应用的时候,我们常常会涉及到图片预览.上传等的处理,往往业务需求不止一张图片,因此相对来说,需要考虑的全面一些,用户还需要对图片进行预览和相应的处理,在开始的时候我使 ...

  9. JavaScript实现本地图片上传前进行裁剪预览

    本项目支持IE8+,测试环境IE8,IE9,IE10,IE11,Chrome,FireFox测试通过 另:本项目并不支持Vue,React等,也不建议,引入JQuery和Vue.React本身提倡的开 ...

  10. 用Vue来实现图片上传多种方式

    没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务场景.假设我们要做一个后台系统添加商品的页面,有一些商品名称.信息等字段,还有需要上传商品轮播图的需求. 我们就以Vue.Element ...

随机推荐

  1. Day 13 13.1 refer反爬

    Referer 一.referer是什么: 图片防盗链的技术应该还有其他的,目前了解到的是浏览器的referer,其实这是错误的拼写,正确是应该是referrer.不过现在可以看到Chrome的开发者 ...

  2. 快捷方法1:csdn如何不登录复制代码

    按F12,在console里执行下面两句代码 $("#content_views pre").css("user-select","text" ...

  3. null和undefine的区别

    null和undefine都是基本数据类型,两种类型都只有一个值. 区别: 1.undefined表示已经声明未定义,null表示的是一个空对象(null并不是空对象,js的typeof会将null判 ...

  4. 上传图片到Mongo数据库;从Mongo数据库下载图片显示到前端

    /** * 上传一个图片文件,保存到mongo数据库中 * @param doc * @param parent 文件所在的目录 * @param request * @return */ @Post ...

  5. Vue CLI 2内置框架webpack框架结构解析

    目前Vue已经到3.X版本,相应的Vue CLI也已经是Vue CLI 3版本,创建命令使用vue create,如果要用2.X版的vue init命令,需要全局安装一个桥接工具: npm insta ...

  6. docker中安装db2

    1.查看可安装的db2版本 docker search db2express-c2.下载db2镜像 docker pull ibmoms/db2express-c   3.安装镜像docker run ...

  7. idea字体的大小设置

    idea字体大小设置 两个方法,滚轮.固定大小设置 固定字体大小 file--settings--editor--font--size 修改为需要大小字号,例如20,点击ok 菜单栏的大小设置也差不多 ...

  8. 使用ESP8266连接中文wifi

    使用XCOM串口调试助手调试ESP8266时,想要连接学校的wifi,通过AT+CWLAP可以显示出附近所有wifi的列表,可是XCOM以ascii码格式显示文本,所以中文就乱码了. 一开始我不知道这 ...

  9. [iOS] 随手记录 IDFA 的一些相关内容

    IDFA  IDFA,广告标识符,类似于这一台设备的唯一性标识符,一般提供给第三方去做一些广告的关联. 但如果用户完全 重置系统,或者 "还原位置与隐私" 这个广告标示符会重新生成 ...

  10. The emulator process for AVD Pixel_4_XL_API_30 was killed 问题

    转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/14946317.html 问题: 因为工作关系接触到了Android Studio,新建了4和11系统的模拟 ...