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.mzph.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边缘云…