说明:上传的图片是 file 类型 ,核心就是获取图片文件(file类型的)

实现一:使用 vant2 的图片加载组件 ,选择文件后会触发afterRead方法 ,参数 file 就是文件列表filelist ,file.file 就是图片文件 ;

 async afterRead(file) {
console.log("afterRead");
// 以下是向后端识别图片接口传递file文件
const formData = new FormData();
formData.append("file", file.file); // 注意是传file .raw
const res = await getImageApi(formData);
// console.log(res);
if (res.errno === 0) {
this.$toast.success("上传成功");
} else {
return this.$toast.fail("上传失败");
}
this.imgSrc = `http://124.223.14.236:8060/${res.data.savePath}`;
setItem("IMGSRC", `http://124.223.14.236:8060/${res.data.savePath}`);
// console.log(this.imgSrc);
},

实现方式二:自己使用 input 输入框实现 type为file 类型 ;

 multiple 属性可以选择多个文件上传 ;
input 给click事件不行的,只能使用change事件,click点击的时候就会触发,change选择文件点击确定的时候才会触发 ; <!-- 隐藏的选择文件标签 -->
this.$refs.imgFile.click() 模拟了点击input输入框事件 ;
    <!-- multiple 属性可以选择多个文件上传 -->
<input type="file" name="" id="" ref="imgFile" @change="changeFile" />
<!-- 调用隐藏的选择图片标签 -->

<van-cell
class="avatar-cell"
title="头像"
is-link
center
@click="$refs.imgFile.click()"
>
changeFile 方法被调用 :
 changeFile() {
console.dir(this.$refs.imgFile.files); // filelist对象
const imgFile = this.$refs.imgFile.files[0]; // 接口需要的参数 file类型的图片
console.log(imgFile.size);
if (imgFile.size > 1024 * 1024 * 2)
return this.$toast.fail("不允许超过 2 M");
const typeArr = ["image/png", "image/jpeg", "image/git", "image/jpg"];
if (!typeArr.includes(imgFile.type))
return this.$toast.fail("只支持jpg,png,jpeg,gif格式");
},
      console.dir(this.$refs.imgFile.files); // filelist对象 里面包裹图片数据
 console.dir(this.$refs.imgFile.files[0]); // 图片file文件类型 ;

验证:大小是否大于 2 M ,格式是否符合要求:

  console.dir(this.$refs.imgFile.files); // filelist对象
const imgFile = this.$refs.imgFile.files[0]; // 接口需要的参数 file类型的图片
console.log(imgFile.size);
if (imgFile.size > 1024 * 1024 * 2)
return this.$toast.fail("不允许超过 2 M");
const typeArr = ["image/png", "image/jpeg", "image/git", "image/jpg"];
if (!typeArr.includes(imgFile.type))
return this.$toast.fail("只支持jpg,png,jpeg,gif格式");

点击显示图片预览:生成一个图片预览地址(临时地址)

URL.createObjectURL可以生成一个和此窗口的document一个生命周期的临时地址 ;

ps:多次选择相同的图片并不会触发 change 事件 , 需要情空控件的值

流程 :点击

选择图片 :

开始预览:vant 的popup 包裹一个显示预览图片的组件 ;

<template>
<div>
<img style="width: 100%" :src="imgLink" alt="" />
</div>
</template> <script>
export default {
name: "UpdatePhoto",
props: {
imgLink: {
type: String,
required: true,
},
},
};
</script> <style>
</style>

ps:此时的imgFile 是否可以参数请求??? 可以的

开始进行裁剪 使用的是 cropperjs ;

img 必须是 块级元素 ,是最大宽度 ;

封装修改头像的接口 ;

/**
* 更新头像资料
* ====》 data {data:文件信息}
* 请求头类型 multipart/form-data
* axios 发生请求 如果 data接收的是一个formData实例 会将请求头的类型自动换成multipart/formData-data
* 所以我不需要在 headers 自己设置请求头类型了
*/
export const updateUserPhotoApi = (data) =>
request({
url: "/v1_0/user/photo",
method: "patch",
data,
});
 submit() {
console.log(111);
// 1. 完成裁剪效果
// 裁剪预览效果 const cropper = new Cropper(图片标签节点,配置项目信息) 预览对象
// 裁剪功能 cropper.getCropperCanveas().toBlob((blob) => {blob 就是裁剪后的文件信息})
// ===========? cropper.getCroppedCanvas() 得到一个Canvas处理对象,在调用toBlob方法转正文件信息
this.$toast.loading("正在更新");
// async 修饰回调函数(箭头函数)
this.cropper.getCroppedCanvas().toBlob(async (blob) => {
console.log("blob是什么", blob);
// 2. 完成上传更新图片效果
// 实例化一个formFData对象
const fd = new FormData();
fd.append("photo", blob);
console.log("fd是什么", fd);
const { data } = await updateUserPhotoApi(fd);
// loadign 遇到 success 就会停止 loading
this.$toast.success("更新完成");
// console.log(data);
// 成功时候更新视图 关闭弹层
this.$emit("updatePhoto", data.data.photo);
this.$emit("close");
});
},

本地图片上传服务器返回在线地址接口 - file - input -修改头像-带预览功能- 然后使用cropperjs 进行裁剪的更多相关文章

  1. 本地图片上传到GitHub,MarkDown使用Github图片地址

    最近在学习用markdown编辑器,我是直接用有道云笔记编辑的,感觉真的好好用,编辑了一半的博客,可以按样式保存在云笔记中,我再也不会忘记写博客了~~ 但是在编辑博客的时候发现了一个问题,那就是本地图 ...

  2. TinyMCE的使用(包括汉化及本地图片上传功能)

    TinyMCE我就不多介绍了,这是下载地址:https://www.tinymce.com/download/ 下载下来是英文版,要汉化也很简单.首先去网上随便下载个汉化包,然后把汉化包解压后的lan ...

  3. 本地图片上传与H5适配知识

    最近用到本地图片上传作为API的参数,在网上看了许多,记录一下,以后可能用的着(仅自己记录用,看不清请绕路) function getObjectURL(file) { var url = null ...

  4. python实现本地图片上传到服务区

    本地图片上传到服务器,其本质上来讲,就是读取本地图片,复制到服务器,并返回服务器url 前端代码,用的form表单提交,form表单中包含两个文件选择表单元素,选择文件,点击提交按钮,提交form表单 ...

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

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

  6. JS兼容各个浏览器的本地图片上传即时预览效果

    JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...

  7. 【咸鱼教程】本地图片上传。动态GIF表情图生成

    本案例参考:http://emoji.decathlon.trustingme.cn/但是实现方式不一样. 教程目录一 head first二 打开本地图片功能三 拖拽和缩放手势,调整图片四 gifj ...

  8. scp -本地文件上传服务器,指定端口

    scp 命令可以将本地文件上传服务器,或者将服务器上的文件下载到本地, 1.  上传服务器: scp [本地文件目录]  [服务器用户名]@[服务器名]:/[服务器上文件路径] 比如 scp /Doc ...

  9. markdown编辑器typora本地图片上传到自己的服务器

    typora是windows平台下最受欢迎的markdown书写工具和查看工具,本篇文章将会介绍如何在typora平台使用java脚本程序自动上传本地图片到自己的服务器,从而让markdown文章中的 ...

  10. [转]微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传

    本文转自:http://blog.csdn.net/qq_31383345/article/details/53014610 今天遇到微信小程序的用户头像设置功能,做笔记. 先上gif: 再上代码: ...

随机推荐

  1. Springboot + Vue ElementUI 实现MySQL可视化

    一.功能展示: 效果如图: DB连接配置维护:   Schema功能:集成Screw生成文档,导出库的表结构,导出表结构和数据 表对象操作:翻页查询,查看创建SQL,生成代码 可以单个代码文件下载,也 ...

  2. 【Java】JDBC Part5.1 Hikari连接池补充

    Hikari Connection Pool Hikari 连接池 HikariCP 官方文档 https://github.com/brettwooldridge/HikariCP Maven依赖 ...

  3. 【JavaScript】Jquery事件绑定问题

    我们所知道的选择器方式,其中有一种方式是属性选择器: <div style="display: flex; justify-content: space-between;"& ...

  4. linux测试cpu性能的命令

    linux测试cpu性能的命令 在Linux中,可以使用多种命令来测试CPU性能.以下是一些常用的命令: stress: 一个通用的压力测试工具,可以生成CPU.内存.IO等负载. 安装: sudo ...

  5. 使用lanczos算法进行的预处理共轭梯度算法(Preconditioned Conjugate Gradients Method)

    构造预处理矩阵M(对称正定) 下图来自:预处理共轭梯度法(1) 下图来自:预处理(Preconditioning) 根据上面的对于预处理共轭梯度法的介绍,我们可以得到使用lanczos算法进行的预处理 ...

  6. 国产操作系统 “银河麒麟操作系统V10” 试用失败历程

    面对外国的科技封锁,具有自主产权的国产软件已经变得迫在眉睫了,几天前在新闻上看到国产的操作"银河麒麟操作系统V10"已经发布,于是抱着尝鲜的心态想着去试着用用.虽然都是基于linu ...

  7. 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(4) —— state-of-the-art

    <2048>游戏在线试玩地址: https://play2048.co/ 该游戏的解法比较不错的资料为外网的一个讨论帖子: What is the optimal algorithm fo ...

  8. git在idea中的冲突解决(非常重要)

    1.什么是冲突 冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致.读起来有点绕,结合下面的案例理解. 从上面对冲突的定义来看,冲突时发生在同一个文件上的. 2.生产上冲突的场景 常见冲突的 ...

  9. 如何在通用异常处理时获取到方法名称(获取注解参数JoinPoint)

    1.背景 很多时候我们在梳理公共异常时,需要获取到接口的而具体名称,便于很好的提示是那个接口错误了 2.实现逻辑 1.在controller方法上的注解上写方法名称,一般使用了swagger都有方法名 ...

  10. PostgreSQL允许远程连接

    PostgreSQL安装后,貌似默认是只接受本地机器连接访问.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置.以下是我配置远程连接PostgreSQL数据库方式: 修改配 ...