node.js 實戰——在express 中將input file 美化,并完成裁剪、上傳進度條

美化上傳按鈕

在這里插入圖片描述

在ejs 頁面

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></meta><title><%= title %></title><link rel='stylesheet' href='/stylesheets/form.css'/><!-- 本地 Bootstrap 引入方式 --><link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet"><script src="/bootstrap/js/bootstrap.bundle.min.js"></script><script src="./javascripts/image-upload.js"></script>
</head>
<body>
<div class="container"><h1>文件上傳</h1><from action="/upload-img" method="post" enctype="multipart/form-data"><label class="upload-container"><span class="upload-icon" id="uploadIcon">+</span><input accept="image/*" id="avatarInput" type="file" /><img id="avatarPreview" class="preview-img d-done" /><button type="button" class="remove-btn" id="removeBtn">x</button></label><button type="submit" class="btn btn-primary mt-3">提交</button></from>
</div>
</body>
</html>

樣式

.upload-container{width: 150px;height: 150px;border: 2px solid #ccc;border-radius: 10px;display: flex;align-items: center;justify-content: center;cursor: pointer;position: relative;overflow: hidden;background-color: #f8f9fa;transition:border-color 0.3s;.upload-icon{font-size:2rem;color:#999;//禁用鼠標事件,該元素變得“不可點擊”、“鼠標穿透”pointer-events: none;  //用來控制一個元素是否能響應鼠標事件(點擊、懸停、拖動等)}.preview-img{width:100%;height: 100%;object-fit: cover;position: absolute;top: 0;left: 0;}.remove-btn{position: absolute;top:5px;right:5px;background-color:rgba(0,0,0,.6);color:#ffffff;border:none;border-radius:50%;width:24px;height:24px;display:none;align-items: center;justify-content: center;cursor:pointer;font-weight: bold;}
}.upload-container:hover{border-color: #007bff;
}.upload-container input[type="file"]{position: absolute;opacity: 0;height: 100%;width: 100%;cursor: pointer;
}

完成效果

這個效果沒有裁剪,進度條、多圖片上傳
在這里插入圖片描述

上傳進度條

   <div class="progress mt-2 d-done" id="progressWrapper"><div class="progress-bar" role="progressbar" id="uploadProgress" style="width: 0%">0%</div></div>
 document.getElementById('uploadForm').addEventListener('submit', function(e){e.preventDefault();// const blob =preview._blob;// if(!blob){//     alert("請先選擇并裁剪頭像");//     return;// }const file =input.files[0];if(!file) return alert('Please upload a valid image!');let formData = new FormData();formData.append('file', file);let xhr = new XMLHttpRequest();xhr.open('POST', '/upload-avatar');xhr.upload.addEventListener('progress', (e) => {if(e.lengthComputable){let percent = Math.round((e.loaded / e.total) * 100);progressWrapper.classList.remove('d-none');progressBar.style.width= percent + '%';progressBar.innerText = percent + '%';}})xhr.onload =function () {if(xhr.status === 200) {alert("successfully uploaded!");}else{alert("fail to upload");}}xhr.send(formData);})

使用cropperjs 裁剪圖片

使用npm安裝

npm install cropperjs@1.5.13

? 關鍵點:cropperjs@2.x 為模塊化版本,不再提供 dist/ 下的瀏覽器用 JS/CSS 文件

從 v2.0.0 開始,cropperjs 改為 純 ESM(ES Module)包,它不再包含:

  • cropper.js
  • cropper.css
  • dist/ 文件夾

📌 小提示

版本適合人群是否自帶 dist/
1.5.13普通瀏覽器/EJS 項目? 有 JS/CSS,推薦
2.xVite/Webpack 打包項目? 無,需構建

引入js、css

   <!--本地開發引入 cropper --><link rel="stylesheet" href="/cropper/cropper.css"><script src="/cropper/cropper.js"></script>

彈框

<!-- 裁剪模態框--><div class="modal fade modal-mask" id="cropModal" tabindex="1" aria-hidden="true"><div class="modal-dialog modal-dialog-centered modal-fullscreen"><div class="modal-content p-3"><div class="modal-body" style="width: 100%; height: 600px;"><img id="cropImg"  /></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button><button type="button" class="btn btn-success" id="cropConfirm">確認裁剪</button></div></div></div></div>

js

input.addEventListener('change', (e)=> {let that=e.target;let file=that.files[0];if(file && file.type.startsWith('image/')) {let reader=new FileReader();reader.onloadend = (e) => {//未裁剪前使用的代碼// preview.src = e.target.result;// preview.classList.remove('d-none');// removeBtn.style.display = 'flex';// uploadIcon.style.display = 'none';//裁剪時的代碼cropImage.src = e.target.result;new bootstrap.Modal(document.getElementById('cropModal')).show();cropImage.onload =()=>{if(cropper) cropper.destroy();cropper =new Cropper(cropImage,{aspectRatio: 1,autoCropArea:1,viewMode:2})}}reader.readAsDataURL(file);}})

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80633.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80633.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80633.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL為什么選擇B+樹

1.hash表&#xff1a;不支持范圍查詢 2.跳表&#xff1a;索引層增加太快&#xff0c;IO成本增加太快 3.二叉樹、AVL樹、紅黑樹&#xff1a;樹高度增加太快&#xff0c;IO成本增加太快 4.B樹&#xff1a;樹高增加太快&#xff1b;范圍查詢只能走中序遍歷&#xff0c;IO成本很…

go程序編譯成動態庫,使用c進行調用

以下是使用 Go 語言打包成 .so 庫并使用 C 語言調用的完整步驟&#xff1a; 1. Go 語言打包成 .so 庫 &#xff08;1&#xff09;編寫 Go 代碼 創建一個 Go 文件&#xff08;如 calculator.go&#xff09;&#xff0c;并定義需要導出的函數。導出的函數名必須以大寫字母開頭…

YOLO-World:基于YOLOv8的開放詞匯目標檢測

文章目錄 前言1、出發點2、方法2.1.TextEncoder2.2.ReparmVLPAN2.3.輸出頭 3、實驗3.1.數據集3.2.LVIS測試集 總結 前言 本文介紹一篇來自騰訊的開放詞匯檢測工作&#xff0c;發表自CVPR2024&#xff0c;論文鏈接&#xff0c;開源地址。 1、出發點 GroundingDINO在開放詞匯檢測…

華為網路設備學習-21 IGP路由專題-路由過濾(filter-policy)

一、路由過濾&#xff08;filter-policy&#xff09; 1、用于控制路由更新、接收的一個工具 2、只能過濾路由信息&#xff0c;無法過濾LSA 二、路由過濾&#xff08;filter-policy&#xff09;與動態路由協議 1、距離矢量路由協議 RIP動態路由協議 交換的是路由表&#xff0…

美化IDEA注釋:Idea 中快捷鍵 Ctrl + / 自動注釋的縮進(避免添加注釋自動到行首)以及 Ctrl + Alt + l 全局格式化代碼的注釋縮進

打開 Settings 界面&#xff0c;依次選擇 Editor -> Code Style -> Java&#xff0c;選擇 Code Generation&#xff0c; 取消 Line comment at first column 和 Block comment at first column 的勾選即可&#xff0c; 1、Line comment at first column (行注釋在第一列…

服務器數據恢復—硬盤壞道導致EqualLogic存儲不可用的數據恢復

服務器存儲數據恢復環境&故障&#xff1a; 一臺EqualLogic某型號存儲中有一組由16塊SAS硬盤組建的RAID5陣列。上層采用VMFS文件系統&#xff0c;存放虛擬機文件&#xff0c;上層一共分了4個卷。 磁盤故障導致存儲不可用&#xff0c;且設備已經過保。 服務器存儲數據恢復過程…

openharmony系統移植之gpu mesa3d適配

openharmony系統移植之gpu mesa3d適配 文章目錄 openharmony系統移植之gpu mesa3d適配1. 環境說明2. gpu內核panfrost驅動2.1 使能panfrost驅動2.2 panfrost dts配置 3. buildroot下測試gpu驅動3.1 buildroot配置編譯 4. ohos下mesa3d適配4.1 ohos下mesa3d編譯調試4.1.2 編譯4.…

Kafka生產者send方法詳解

Kafka生產者send方法詳解 1. send方法的工作原理 1.1 基本流程 #mermaid-svg-EXvKiyf8oSlenrxK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-EXvKiyf8oSlenrxK .error-icon{fill:#552222;}#mermaid-svg-EXvKiyf…

【sdkman】sdk命令使用簡介

SDKMAN! 使用指南 SDKMAN! 是一個用于管理多個軟件開發工具包版本的命令行工具。 基本命令 安裝 SDK # 安裝最新穩定版 sdk install java# 安裝特定版本 sdk install scala 3.4.2# 安裝本地版本 sdk install groovy 3.0.0-SNAPSHOT /path/to/groovy-3.0.0-SNAPSHOT sdk ins…

開源字體設計工具字玩 FontPlayer

開源字體設計工具字玩 FontPlayer 內測版 v0.2.0 于 2025 年 5 月 9 日發布 基礎功能&#xff1a;用戶可以使用該工具繪制字體并導出 otf 字體文件&#xff0c;設計屬于自己的字庫。腳本功能&#xff1a;提供了腳本功能&#xff0c;用戶可以用程序的方式繪制字形組件&#xff0…

快速入門深度學習系列(3)----神經網絡

本文只針對圖進行解釋重要內容 這就是入門所需要掌握的大部分內容 對于不懂的名詞或概念 你可以及時去查 對于層數 標在上面 對于該層的第幾個元素 標在下面 輸入層算作第0層 對于第一層的w b 參數 維度如下w:4*3 b:4*1 這個叫做神經元 比如對于第一層的神經元 這里說的很…

【Python 算法零基礎 2.模擬 ⑤ 基于棧和隊列】

目錄 基于棧 Ⅰ、1441. 用棧操作構建數組 算法與思路 ① 初始化操作序列 ② 遍歷數字范圍 ③ 判斷并添加操作 ④ 提前結束循環 ⑤ 返回操作序列 基于隊列 Ⅰ、1700. 無法吃午餐的學生數量 思路與算法 ① 統計學生對三明治的需求&#xff1a; ② 遍歷三明治供應順序&#xff1a;…

管家婆實用貼-如何在Excel中清除空格

我們在使用管家婆軟件時&#xff0c;經常會用到Excel表格導入導出數據&#xff0c;在使用Excel整理數據時&#xff0c;數據中的空格可能會導致計算和分析出現問題。無論是多余的前導空格、尾部空格還是單元格中的不必要空格&#xff0c;清除它們都是確保數據準確性的關鍵。今天…

uniapp-商城-53-后臺 商家信息(更新修改和深淺copy)

1、概述 文章主要討論了在數據庫管理中如何處理用戶上傳和修改商家信息的問題&#xff0c;特別是通過深淺拷貝技術來確保數據更新的準確性和安全性。 首先&#xff0c;解釋了深拷貝和淺拷貝的區別&#xff1a;淺拷貝使得兩個變量共享相同的內存地址&#xff0c;而深拷貝則創建新…

numpy模塊綜合使用

一、numpy模塊的綜合使用方法 # 使用矩陣的好處&#xff0c;矩陣對于python中列表&#xff0c;字典等數據類型一個一個拿來計算是會方便計算很多的&#xff0c;底層使用的是c語言 # 在數據分析和數據處理的時候也經常常用 import numpy as np array np.array([[1,2,3],[2,3,4…

【github分享】開發者學習路線圖

地址&#xff1a;GitHub - kamranahmedse/developer-roadmap: Interactive roadmaps, guides and other educational content to help developers grow in their careers. 介紹&#xff1a;涵蓋了所有領域的開發者路線圖&#xff0c;前端、后端、運維、全棧、編程語言、AI等。…

《Linux命令行大全(第2版)》PDF下載

內容簡介 本書對Linux命令行進行詳細的介紹&#xff0c;全書內容包括4個部分&#xff0c;第一部分由Shell的介紹開啟命令行基礎知識的學習之旅&#xff1b;第二部分講述配置文件的編輯&#xff0c;如何通過命令行控制計算機&#xff1b;第三部分探討常見的任務與必備工具&…

[Java實戰]Spring Boot 解決跨域問題(十四)

[Java實戰]Spring Boot 解決跨域問題&#xff08;十四&#xff09; 一、CORS 問題背景 什么是跨域問題&#xff1f; 當瀏覽器通過 JavaScript 發起跨域請求&#xff08;不同協議、域名、端口&#xff09;時&#xff0c;會觸發同源策略限制&#xff0c;導致請求被攔截。 示例場…

MyBatis快速入門——實操

默認&#xff1a;電腦搭建好了Maven環境 本次入門實驗使用的idea版本&#xff1a;ideaU2022.1 目錄 一&#xff1a;前期準備工作 1. 創建一個springboot工程 2. Maven環境配置 3. 在mysql數據庫中創建一個user表 4. 編寫實體類User 二&#xff1a; 引入MyBatis的相關依賴…

IPLOOK超輕量核心網,助力5G專網和MEC邊緣快速落地

隨著5G深入千行百業&#xff0c;行業客戶對核心網的靈活性、可控性和部署效率提出了更高要求。IPLOOK面向數字化轉型需求&#xff0c;推出了超輕量級核心網解決方案&#xff0c;具備體積小、資源占用少、部署靈活、易于維護等特性&#xff0c;廣泛適用于專網、實驗室、MEC邊緣云…