javascript --- [FormData的使用] 文件上传进度条展示 文件上传图片即使预览

1. 准备工作

因为要发送Ajax请求,而Ajax技术的运行需要网站环境,因此其中一个解决方案是,将页面作为网站的静态资源暴露出来,然后通过浏览器进行访问.

1.1 静态资源

  • 使用express将public下面的资源暴露出来
  • 在根目录下面新建一个public文件夹和一个app.js文件
// app.js
const express = require('express');
const path = require('path')
const app = express();app.use(express.static(path.join(__dirname, 'public')))app.listen(3000, () =>{console.log('localhost:3000');
})
  • 在public下新建一个01.html
<!-- 01.html -->
<body><h2>通过静态资源访问 01.html</h2>
</body>
  • 命令行输入nodemon app.js(注意目录), 打开浏览器访问localhost:3000/01.html

2. 文件上传的进度条展示

  • 下面的样式使用到了 bootstrap. 不导入也没关系
  • 在文件上传的过程中,可以将上传的进度实时展示出来,这样用户的体验感会提升
  • 核心代码如下:
file.onchange = function () {xhr.upload.onprogress = function (ev) {console.log( (ev.loaded / ev.total) * 100 + '%' );}
}
  • 思路如下:

1.在input框下面有一个显示进度条的元素

2.点击文件上传后,会触发file.onchange事件

3.在文件传到服务器(FormData)的过程中会持续触发xhr.upload.onprogress事件.

4.在onprogress事件中,会有一个ev对象,它保留着,文件上传的信息

5.利用文件上传的信息,算出上传的进度,显示在网页中

2.1 [栗子] - 上传的表单控件

<div class="container"><div class="form-group"><label>请选择文件</label><input type="file" id="file" /><br /><div class="progress"><div class="progress-bar" style="width: 0%;" id="bar">0%</div></div></div>
</div>

2.2 [栗子] - 上传的代码(前端)

<script>var file = document.getElementById('file');var bar = document.getElementById('bar');file.onchange = function () {// 文件上传使用到 FormData构造函数var formData = new FormData();// 'attrName'方便后面使用.formData.append('attrName', this.files[0]);// 上传的信息准备好了,接下来准备Ajax请求var xhr = new XMLHttpRequest();xhr.open('post','http://localhost:3000/uploads');// 文件上传的过程中,会持续触发onprogress事件xhr.upload.onprogress = function(ev){var result = (ev.loaded / ev.total) * 100 + '%';// 算出上传的百分比,并将值放在bar中bar.style.width = result;bar.innerHTML = result;}xhr.send(formData);xhr.onload = function () {if(xhr.status == 200 ){console.log(xhr.responseText)}}}
</script>

2.3 [栗子] - 上传的代码(服务端)

// 服务端使用formidable解析参数
const formidable = require('formidable');
const path = require('path')
app.post('/uploads', (req, res)=>{// 创建接收的实例const form = new formidable.IncomingForm();// 设置文件的存储位置form.uploadDir = path.join(__dirname, 'public', 'uploads');// 保留后缀名form.keepExtensions = true;// 解析客户端的数据form.parse(req, (err, fields ,files) =>{res.send({ path: files.attrName.path.split('public')[1] })})
})

3. 文件上传图片即使预览

  • 以前写过一篇放在前端内存中的
  • 这一篇是:
    • 将图片通过FormData传递到服务端
    • 然后服务端将图片保存在静态资源中,并将资源的地址返回给客户端
    • 然后客户端访问这个静态资源进行显示

3.1 [栗子] - 前端dom元素如下

<div class="container"><div class="form-group"><label>请选择</label><input type="file" id="file" /><!-- 用来显示上传的图片 --><div class="padding" id="box"></div></div>
</div>

3.2 [栗子] - 前端上传文件的代码

<script>var file = document.getElementById('file');var box = document.getElementById('box');file.onchange = function () {var formData = new FormData();formData.append('attrName', this.files[0]);var xhr = new XMLHttpRequest();xhr.open('post', 'http://localhost:3000/uploads')xhr.send(formData);xhr.onload = function() {if(xhr.status == 200) {var result = JSON.parse(xhr.responseText);var img = document.createElement('img');img.src = result.path;img.onload = function() {box.appendChild(img)}}}}	
</script>

3.3[栗子] - 后端代码

// 服务端使用formidable解析参数
const formidable = require('formidable');
const path = require('path')
app.post('/uploads', (req, res)=>{// 创建接收的实例const form = new formidable.IncomingForm();// 设置文件的存储位置form.uploadDir = path.join(__dirname, 'public', 'uploads');// 保留后缀名form.keepExtensions = true;// 解析客户端的数据form.parse(req, (err, fields ,files) =>{res.send({ path: files.attrName.path.split('public')[1] })})
})

4. 参考

源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018年春阅读计划---阅读笔记4

uml图的几大特点&#xff1a;容易掌握 2.面向对象 3.可视化&#xff0c;表达能力强大 4.容易掌握使用 5.与编程语言的关系。用c&#xff0c;java等编程语言可以实现一个系统&#xff0c;支持uml 的一些工具&#xff0c;可以根据uml所建立的系统模型自动产生代码框架。 uml的5类…

TP5之安全机制

防止sql注入 1、查询条件尽量使用数组方式&#xff0c;具体如下&#xff1a; 1 $wheres array(); 2 3 $wheres[account] $account; 4 5 $wheres[password] $password; 6 7 $User->where($wheres)->find(); 2、如果必须使用字符串&#xff0c;建议使用预处理机制&am…

javascript --- [jsonp] script标签的妙用(绕过同源限制)

1. 同源 1.1 什么是同源 协议、域名、端口号相同 1.2 为什么有同源政策 同源政策是为了保护用户信息的安全,放置恶意的网站窃取数据。最初的同源政策是指A网站再客户端设置的Cookie,B网站是不能访问的. 随着互联网的发展,同源政策也越来越严格,在不同源的情况下,其中有一项…

SQL登录报错

在安装完SQL后&#xff0c;发现报出了error40和53的错误&#xff0c;作为小白的我也是一脸懵逼&#xff0c;明明一切都是按照默认加下一步安装的&#xff0c;为什么到了连接数据库的时候就出现了问题呢&#xff1f; 后来经过调查&#xff0c;发现需要将sql配置管理的ip中的一项…

复活

此刻--复活转载于:https://www.cnblogs.com/lyqlyq/p/9881646.html

javascript --- 瀑布流的实现

说明 源代码 1. 瀑布流 出现问题: 设计给的图片不是同一个尺寸大小,因此不能规则的放入到给定的DOM结构中.此时,需要使用瀑布流技术来解决这个问题 解决的思路: 让图片等宽、不等高 核心: 用到了定位 img {position: absolute;left: 最小的索引 * 图片的宽度;top: 最小的图…

不同权限访问详细细节

1 package com.package1;2 3 /**4 * 程序执行入口和调用方法在不同类但在同一个包中&#xff0c;除了private方法&#xff0c;其他任何权限的方法都可以都可相互调用5 * author Administrator6 *7 */8 public class Source {9 public static void main(String[] args) …

洛谷P2822组合数问题

传送门啦 15分暴力&#xff0c;但看题解说暴力分有30分。 就是找到公式&#xff0c;然后套公式。。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;long long read(){char ch;bool f false;wh…

基于Docker的GoldenGate部署

前言Docker最近几年异常火爆&#xff0c;主要是因为其方便、快捷、轻量&#xff0c;相对于VM&#xff0c;它不需要占用太多资源&#xff0c;随时可以创建、删除&#xff0c;或在已有image上添加一些软件&#xff0c;再制作成另一个模板image供日后使用。Docker提供的Hub或priva…

javascript --- 防抖与节流

说明 源码 1. 防抖与节流 1.1 防抖 防抖: 触发事件后,在n秒内函数只执行一次 记忆: 你手比较抖,不小心按了按钮2下…你只希望它只执行一次.且按第二次结束时间算…这就用到了防抖技术 1.2 节流 节流: 连续发生的事件,在n秒内只执行一次函数 1.3 防抖与节流的区别 在一段…

bugku_本地包含

先上payload: 1、?hello);show_source(%27flag.php%27);// 2、?hello);include $_POST[zzz];// POST传参:zzzphp://filter/readconvert.base64-encode/resourceflag.php 3、?hellofile(%27flag.php%27) 4、?helloshow_source(flag.php) 首先我们来看源码&#xff1a; <?…

javascript --- js中的作用域 变量提升

1 求以下函数的输出 1.1 考察点: 变量提升、this、作用域 // 考察点 作用域、this、变量提升 var a 10 function test() {a 100console.log(a) console.log(this.a) var aconsole.log(a) } test()第一个和第三个肯定是100在node环境下,没有window的概念,因此输出的是 und…

洛谷1091合唱队形

题目描述 N位同学站成一排&#xff0c;音乐老师要请其中的(N−K)位同学出列&#xff0c;使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设K位同学从左到右依次编号为1,2,…,K&#xff0c;他们的身高分别为T1​,T2​,…,TK​&#xff0c; 则他们的身高…

poj3069 Saruman's Army(贪心)

https://vjudge.net/problem/POJ-3069 弄清楚一点&#xff0c;第一个stone的位置&#xff0c;考虑左右两边都要覆盖R&#xff0c;所以一般情况下不会在左边第一个&#xff08;除非前两个相距>R&#xff09;。 一开始二层循环外层写的i1&#xff0c;这样对于数据诸如1 1 1>…

Redis的key和value大小限制

Redis的key和value大小限制今天研究了下将java bean序列化到redis中存储起来&#xff0c;突然脑袋灵光一闪&#xff0c;对象大小会不会超过redis限制&#xff1f;不管怎么着&#xff0c;还是搞清楚一下比较好&#xff0c;所以就去问了下百度&#xff0c;果然没多少人关心这个问…

jquery --- 监听tab栏的变化

1. jQuery样式操作 1.1 操作css方法 参数只写属性名,则返回属性值(字符串) $(this).css(color)参数是 属性名、属性值(逗号分隔&#xff0c;则表示设置属性 $(this).css(color,red)参数可以是对象的形式 $(this).css({width: 400px,height: 400px })1.2 设置类样式方法 添…

bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】

bzoj题面什么鬼啊…… 题目大意&#xff1a;有一个初始值均为0的数列&#xff0c;n次操作&#xff0c;每次将数列(ai,bi-1)这个区间中的数与ci取max&#xff0c;问n次后元素和 离散化&#xff0c;然后建立线段树&#xff0c;每次修改在区间上打max标记即可 #include<iostrea…

Redis单机和集群环境搭建

一、安装单机版redis 1、可以自己去官网下载&#xff0c;当然也可以用课程提供的压缩包 # yum install gcc # wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz # tar -xzvf tcl8.6.1-src.tar.gz # cd /usr/local/tcl8.6.1/unix/ # ./configure # make &…

yum离线安装

安装yum-plugin-downloadonly插件 yum install -y yum-plugin-downloadonly下载对应的软件包&#xff0c;我们以mysql为例&#xff0c;终端输入如下命令 yum install -y --downloadonly --downloaddir/soft/mysql mysql --downloaddir用来指定下载的路径转载于:https://www.cnb…

算法 --- 递归实现多级树展开结构

说明 先根据数据渲染,然后再实现事件 渲染 在项目中,经常会给出一个深度不确定的数组,数字结构如下: data [{name: a, child:[{name: a1},{name: a2, child: [{name:a21}]}]},{name: b} ]要求将数组渲染成对应的目录结构, 结构如下: <ul><li>a<ul><…