在平时项目开发中,我们经常会对文件做一些上传操作,不仅仅要实现基本需求,也要兼顾用户体验,根据自己在工作中遇到的问题谈谈对图片上传的预览以及上传进度的优化。

1.搭建项目

基于Vue.js+axios搭建的项目,新建一个Index.Vue项目如下,基本结构可以先可以选择文件,预览文件。

上传图片

选择文件:

图片预览:

上传文件到服务器

...

data(){

return{

imgPreViewSrc:'', //文件预览地址

file:null, //上传文件

}

}

methods:{

}

...

.text-center{

text-align: center;

}

.wrapper{

font-size: 16px;

width: 60%;

height: 100%;

margin: 0 20%;

border: 1px solid #ddd;

img{

width: 200px;

}

button{

width:120px;

height: 30px;

margin-top: 30px;

line-height: 30px;

border: 1px solid #CCC;

text-align: center;

}

}

input的类型type设置为file,可以选择文件,multipe属性设置为true,一次可以选择多个文件。

运行项目,页面如下:

2.选择文件以及预览

选择一个图片文件(bg.jpg),之前有在input绑定文件改变监听方法,打印事件参数如下:

发现刚才选择的文件在Event>target>files下面

files是一个数组,刚才只选择了一张图片,所以长度为1,图片的名称(name),大小(size),类型(type)都有包含。

2.1.设置文件类型

在input标签accept属性设置文件类型,当用户打开文件资源管理器选择文件时,会过滤掉其他类型文件,能够从源头避免用户选择脏文件,也更加方便用户选择文件。

2.2.图片预览

要将用户选择的文件显示到页面上,以方便用户下一步操作,因为用户可能会从选择的文件中再挑选几张图片操作,例如上传到服务器。

图片预览要用到URL对象的URL.createObjectURL(file)方法生成一个blob地址,直接赋值给img标签的src,页面就可以展示。(URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。)

在methods添加handleFileChange方法,预览图片

...

// 文件改变监听事件

handleFileChange(evt){

console.log(evt);

let file=evt.target.files[0];

this.file=file;

let src=URL.createObjectURL(file);

this.imgPreViewSrc=src;

},

...

3.显示上传文件进度

选择好文件之后,文件要上传到服务器,有时候文件很大或者网速很慢的情况下,用户需要知道已经上传进度,如果没有上传进度,用户退出页面那么文件就上传失败了。

3.1.修改script文件

引入axios,封装上传Promise函数

在methods里添加上传方法uploadFile

import axios from 'axios';

// 文件上传服务api

const baseURL='http://127.0.0.1/api';

function upload (params,cb=null) {

return new Promise((resolve, reject) => {

axios.create({

baseURL,

})({

url:'/upload/uploadFile/image',

method:'post',

data:params,

// 上传进度

onUploadProgress:function(progressEvent){

if(progressEvent.lengthComputable && cb){

cb(progressEvent);

}

},

}).then(res => {

console.log(res.data);

if(res.status===200){

resolve(res.data);

}else{

reject(res.data);

}

}).catch(err => {

reject(err);

});

});

}

...

// 上传文件到服务器

uploadFile(){

let file=this.file;

if(file){

let formData = new FormData();

formData.append('file', file);

upload(formData,(progressEvent)=>{

console.log(progressEvent);

});

}else{

alert('请选择文件')

}

...

3.2.上传进度

在axios入参新增onUploadProgress方法,在文件上传过程中该方法会调用,参数包含上传的一些信息。

有关ProgressEvent的一些介绍:

ProgressEvent 是一个用来测量底层操作进度的接口,可以测量HTTP请求(例如:一个 XMLHttpRequest请求、或者一个底层资源如img,audio,video等,ProgressEvent常用属性值:

ProgressEvent.lengthComputable:它是一个布尔值标识,表明总共需要完成的工作量和已经完成的工作是否可以被底层所计算到。换而言之,它表示的就是过程是否是可以测量的。

ProgressEvent.loaded:是一个unsigned long long类型,表示底层进程已经执行的工作量。所做的工作比率可以用属性和ProgressEvent.total计算。当使用HTTP下载资源时,这只表示内容本身的一部分,而不是头和其他开销。

ProgressEvent.total:是unsigned long long类型,表示底层进程正在执行的工作总量。当使用HTTP下载资源时,这只表示内容本身,而不是头和其他开销。

点击上传按钮,打开控制台:

可以发现ProgressEvent中loaded属性值为图片文件上传的大小,total为文件的大小。

3.3.在页面添加进度条

为了组件通用化,新建一个Progress.vue组件,接受一个progressValue进度参数。

上传进度:{{progressValue}}%

上传成功!

export default {

props:['progressValue'],

name: 'Progress',

};

.progress-box{

position: fixed;

top:0;

left:0;

bottom: 0;

right:0;

background: rgba(0,0,0,0.5);

.progress-content{

position: absolute;

top:50%;

left:50%;

width: 300px;

height: 76px;

padding: 8px 30px;

transform: translate(-150px,-38px);

background: #fff;

border-radius: 8px;

p{

margin-bottom: 5px;

}

progress{

width: 100%;

height: 22px;

}

progress::-webkit-progress-bar{

background-color:#d7d7d7;

}

progress::-webkit-progress-value{

background-color:orange;

}

}

}

在div末尾添加Progress组件,再修改Index.vue文件methods的上传方法:

...

import Progress from '../components/Progress';

...

// 上传文件到服务器

uploadFile(){

let file=this.file;

if(file){

let formData = new FormData();

formData.append('file', file);

upload(formData,(progressEvent)=>{

this.isShowProgressBox=true;

this.progressValue=parseFloat((progressEvent.loaded/progressEvent.total*100).toFixed(2));

if(this.progressValue===100){

let timer=setTimeout(()=>{

this.isShowProgressBox=false;

clearTimeout(timer);

timer=null;

},500);

}

});

}else{

alert('请选择文件');

}

...

可以看到,点击上传后,页面出现进度模态框,让用户知道已经上传百分比,优化用户体验。

关于图片上传其实还能优化的方面还有很多,后续在工作中遇到问题再加以论述。

axios获取图片显示_Vue.js+axios图片预览以及上传显示进度相关推荐

  1. H5图片预览及上传(WEB前端)

    H5图片预览及上传 web上传图片很简单,网上有许多的demo和js,但是本人嫌弃用那些会引入许多js包,所以还是用原生的jquery来写吧. 一.html布局文件 html有一个自己的上传文件控件- ...

  2. js预览待上传的本地图片

    來源:http://www.cnblogs.com/conquer/archive/2008/03/22/1117367.html <input id="file" type ...

  3. element upload预览_element-ui上传组件图片默认不上传显示图片缩略图

    新入职公司,新团队实训练手项目,后端没有提供单独的图片上传接口,需要用form/data 形式表单字段和图片文件一起提交,element UI 的上传组件默认需要启用action. 在选取图片文件后为 ...

  4. 【微信小程序】图片选择、转码、压缩、预览、上传,file与base64

    0 前言 微信小程序中,上传图片,如标题,涉及图片选择.图片转码.图片压缩.图片预览.图片上传等 1 图片选择 需要使用微信提供的wx.chooseMedia chooseImage() {var t ...

  5. android h5选择图片上传,js-微信H5选择多张图片预览并上传(兼容ios,安卓,已测试)...

    值得注意的是: 1.在微信H5中选择图片运用:wx.chooseImage, 上传图片:wx.uploadImage. 2.上传图片的时候务必是一张一张的上传的(建议采用递归) 3.一张图片上传成功后 ...

  6. CKEditor4.6.2 图片/Flash上传及预览 附件上传

    最近做富文本编辑器,最后选用了 CKeditor,个人更喜欢这个编辑器的风格.本文将不再阐述CKeditor的基础配置,比较的简单,网上例子不少,官方的demo也有. 好,直接进入正题: 1.图片上传 ...

  7. 点击/拖拽两种方式,预览并上传png/jpg/jpeg格式图片

    <template><div class="content"><div class="PictureBox"><img ...

  8. java加vue实例_Vue.Js及Java实现文件分片上传代码实例

    upload(file) { //从后台获取已经上传的文件分片数 getIdx(md5) .then(function(res) { let retry = 3; uploadPart(retry, ...

  9. php 文件预览 水印,PHP图片上传,预览图上传,水印设置

    //设置图片的存放目录 设置水印的存放地址如果愿意,可以给预览图.上传图片分设不同的存储地址 $img_path = $_SERVER['DOCUMENT_ROOT']."/data/img ...

最新文章

  1. MySQL not exists 真的不走索引么?
  2. 成功解决IndexError: index 14 is out of bounds for axis 1 with size 14
  3. asp多表查询并显示_零公式实现多表数据查找!3步设置,简单高效!3分钟学会,真香...
  4. oracle归档目录莫名删除,Oracle归档目录被自动删除的bug
  5. 分享:wkhtmltoimage开源工具的基本应用
  6. 前端开发 表格元素 单元格的合并 0229
  7. 哈工大c语言作业系统,2015秋C语言程序设计
  8. java selenium (十一) 操作弹出对话框
  9. Flink SQL 实战:HBase 的结合应用
  10. pop3 c语言,VisualC#编写实现POP3的程序
  11. 4g通信模块怎么连接sim卡_SIM卡GPRS模块知识详解 浅谈SIM卡GPRS之原理模块
  12. 抖音直播如何快速提升人气热度,让客户下单。
  13. 统计|如何观测两变量之间的相关系数及含义
  14. 初次 使用RuoYi 若依框架总结(前端)
  15. 音乐计算机曲谱狂妄之人,undertale狂妄之人简谱
  16. 【Matlab学习手记】三维矢量场图
  17. excel查找匹配项vlookup函数
  18. 单GDB调试RISC-V CPU 多核时,continue 命令行为解析
  19. 【爬树合集】难啃的骨头——红黑树
  20. 同是数据分析产品, 为什么200万App企业都选择友盟+

热门文章

  1. 图片批量转换pdf文件
  2. RabbitMQ 下载、安装、配置、验证_rpm版本(Linux环境)
  3. 企业实战05:Oracle数据库_操作表中数据
  4. .class和getClass()的区别
  5. hibernate 复合主键 根据主键删除_Python 之 MySql“未解之谜”11--主键 id 那些事
  6. linux 升级mysql版本 lamp_Linux 下安装 LAmp及配置
  7. qt中设置QTabWidget,QGroupBox,QScrollArea的样式
  8. IOS – OpenGL ES 调节图像单色 GPUImageMonochromeFilter
  9. Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程
  10. BugkuCTF-MISC题可爱的故事