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.pswp.cn/news/250349.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250349.shtml
英文地址,請注明出處:http://en.pswp.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><…