实操:Dropzone.js实现文件上传

🏠官网

点我前往

🥓依赖

<script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" />

可选:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

🎈案例

实现手动上传,已选待上传图片可删除,图片可预览

容器:

<h1>文件上传:</h1>
<div><form action="/upload" class="dropzone" id="myDropzone"><div class="fallback"><input name="file" type="file" multiple /></div></form><button id="uploadButton">上传文件</button>
</div>

配置:

<script>// 配置DropzoneDropzone.options.myDropzone = {url: "/upload",method: "post",autoProcessQueue: false, // 设置为false,表示手动触发上传maxFilesize: 10, // 最大文件大小,单位为MBmaxFiles: 3, // 最大上传文件数量acceptedFiles: ".jpg", // 允许上传的文件类型addRemoveLinks: true, // 显示移除文件的链接dictDefaultMessage: "拖放文件到这里或点击上传", // Dropzone区域的默认消息dictRemoveFile: "移除文件", // 移除文件链接的文本init: function() {this.on("removedfile", function(file) {// 移除文件时的操作console.log("文件 " + file.name + " 已被移除");});}};Dropzone.autoDiscover = false;// 初始化Dropzonevar myDropzone = new Dropzone("#myDropzone", {url: "/upload",autoProcessQueue: false // 设置为false,表示手动触发上传});// 手动触发上传document.getElementById("uploadButton").addEventListener("click", function() {myDropzone.processQueue();});
</script>

可选样式:

<style>.dropzone {border: 2px dashed #ccc;border-radius: 5px;padding: 20px;text-align: center;cursor: pointer;}.dropzone:hover {background-color: #f0f0f0;}.fallback input[type="file"] {display: none;}
</style>

🧨后端接口

package com.xxx.rentcarease.controller;import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;@RestController
public class FileUploadController {@PostMapping("/upload")public SaResult uploadFile(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return SaResult.error("请选择要上传的文件");}try {// 上传文件到 src/main/resources/static/img 目录下String fileName = uploadFileToDirectory(file, "src/main/resources/static/img/");// 上传文件到 target/classes/static/img 目录下uploadFileToDirectory(file, "target/classes/static/img/");return SaResult.ok("文件上传成功,保存路径为:" + fileName);} catch (IOException e) {e.printStackTrace();return SaResult.error("文件上传失败:" + e.getMessage());}}private String uploadFileToDirectory(MultipartFile file, String directory) throws IOException {// 获取静态资源目录的绝对路径Path uploadPath = Paths.get(directory);// 生成UUID并截取其中的一部分UUID uuid = UUID.randomUUID();String uuidPart = uuid.toString().substring(0, 8); // 只取UUID的前8个字符// 保存文件byte[] bytes = file.getBytes();String fileName = uuidPart + "_" + file.getOriginalFilename();Path filePath = uploadPath.resolve(fileName);Files.write(filePath, bytes);return filePath.toString();}
}

🎨效果

image-20240403180555042

附:

页面完整代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传测试页面</title><!-- 引入 Dropzone.js 样式 --><linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.css"/><!-- 引入 Dropzone.js 脚本 --><script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script><!-- 引入 jQuery 库 --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><style>.dropzone {border: 2px dashed #ccc;border-radius: 5px;padding: 20px;text-align: center;cursor: pointer;}.dropzone:hover {background-color: #f0f0f0;}.fallback input[type="file"] {display: none;}</style>
</head>
<body>
<hr>
<!-- 文件上传区域 -->
<h1>文件上传:</h1>
<div><form action="/upload" class="dropzone" id="myDropzone"><div class="fallback"><input name="file" type="file" multiple /></div></form><button id="uploadButton">上传文件</button>
</div><script>// 配置DropzoneDropzone.options.myDropzone = {url: "/upload",method: "post",autoProcessQueue: false, // 设置为false,表示手动触发上传maxFilesize: 10, // 最大文件大小,单位为MBmaxFiles: 3, // 最大上传文件数量acceptedFiles: ".jpg", // 允许上传的文件类型addRemoveLinks: true, // 显示移除文件的链接dictDefaultMessage: "拖放文件到这里或点击上传", // Dropzone区域的默认消息dictRemoveFile: "移除文件", // 移除文件链接的文本init: function() {this.on("removedfile", function(file) {// 移除文件时的操作console.log("文件 " + file.name + " 已被移除");});}};Dropzone.autoDiscover = false;// 初始化Dropzonevar myDropzone = new Dropzone("#myDropzone", {url: "/upload",autoProcessQueue: false // 设置为false,表示手动触发上传});// 手动触发上传document.getElementById("uploadButton").addEventListener("click", function() {myDropzone.processQueue();});
</script></body>
</html>

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

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

相关文章

手搓链表(java)(不完整)

手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09; 文章目录 手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09;前言一、代码1.MyLinkedList类&#xff1a;2.测试类&#xff1a; 总结 前言 提示&#xff1a;以下是本篇文章正文内容&…

pip包安装用国内镜像源

一&#xff1a;临时用国内源 可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple 例如&#xff1a;pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspider&#xff0c;这样就会从清华这边的镜像去安装pyspider库 清华&#xff1a;https://py…

LeetCode_876(链表的中间结点)

//双指针//时间复杂度O(n) 空间复杂度O(1)public ListNode middleNode(ListNode head) {ListNode slowhead,fast head;while (fast!null && fast.next!null){slow slow.next;fast fast.next.next;}return slow;} 1->2->3->4->5->null 快指针移动两个…

数据结构——队列(包括循环队列)——Java版

目录 队列介绍&#xff1a; 基本概念&#xff1a; 应用&#xff1a; Java实现示例&#xff1a; 循环队列的Java实现&#xff1a; 队列介绍&#xff1a; 队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它按照先进先出&#xff08;FIFO&#xff0c;Fi…

Linux中的shell脚本之流程控制循环遍历

3 条件判断 4 流程控制语句 1&#xff09;if 语句 案例&#xff0c;用户输入用户名和密码&#xff0c;判断用户名是否是admin,密码是否是123,如果正确&#xff0c;则显示登录成功 首先我创建了shell文件&#xff0c;touch getpawer 其中getpawer 是我自己命的名 #!/bin/bas…

Linux-4 gcc和makefile

Linux编译器-gcc/g使用 1.设计样例 c语言&#xff1a;linux中用的stdc99版本--可能会出现其他问题 c&#xff1a;Linux中用的stdc11--使用c11版本 Linux没有文件格式的区分&#xff0c;但是编译器区分 gcc编译器的文件格式是filename.c g编译器的文件格式是filename.cc或者fil…

C语言--指针4

大家节日快乐&#xff0c;难得的假期&#xff0c;祝你们玩得开心。 今天总结了指针第四部分。 1.回调函数是什么 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指…

公约数(acwing每日一题)

题目描述&#xff1a; 给定两个正整数 a 和 b。 你需要回答 q个询问。 每个询问给定两个整数 l,r&#xff0c;你需要找到最大的整数 x&#xff0c;满足&#xff1a; x 是 a 和 b的公约数。l≤x≤r。 输入格式&#xff1a; 第一行包含两个整数 a,b。 第二行包含一个整数 …

蓝桥杯练习笔记(十七)

蓝桥杯练习笔记&#xff08;十七&#xff09; 一、 输入样例 7 7 1000001 0100010 0010100 0001AAA 00010A0 00010A0 00010A0蓝桥官网题解&#xff1a; 该题解是用了三个循环分别对三个方向的相同字符的长度进行统计&#xff0c;找出最大长度&#xff0c;最后对找出的最长Y进…

做好产品定位的3个重点

产品定位对于项目而言至关重要&#xff0c;正确的产品定位有助于项目锁定目标市场&#xff0c;精准满足客户需求。通过差异化产品策略&#xff0c;让产品在众多竞品中脱颖而出&#xff0c;形成独特竞争优势&#xff0c;从而有助于产品价值的实现。 因此做好产品定位迫在眉睫&am…

在Go语言中如何调试

调试是确定程序为何不像预期那样工作的过程。程序不像预期那样工作的迹象有很多,包括编译错误、运行阶段错误、文件权限错误以及数据不正确等。调试是程序员经常需要做的工作,而要理解Go语言,就必须明白它提供了哪些工具。使用Go语言开发复杂的程序时,调试将成为日常工作中…

POI、EasyExcel操作Excel表格详解

POI、EasyExcel 文章目录 POI、EasyExcel1.简介2.结构3.POI-Excel写1.基本操作2.大文件写入HSSF3.大文件写入XSSF4.大文件写入SXSSF 4.POI-Excel读1.基本操作2.数据类型3.计算公式类型数据读取 5.EasyExcel写1.基本写入操作2.日期、数字或者自定义格式转换3.列宽、行高 6.EasyE…

软件杯 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

【Linux】从零认识文件操作

送给大家一句话&#xff1a; 要相信&#xff0c;所有的不美好都是为了迎接美好&#xff0c;所有的困难都会为努力让道。 —— 简蔓《巧克力色微凉青春》 开始理解基础 IO 吧&#xff01; 1 前言2 知识回顾3 理解文件3.1 进程和文件的关系3.2 文件的系统调用openwrite文件 fd 值…

OpenHarmony实战:小型系统平台驱动移植

在这一步&#xff0c;我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构&#xff1a; device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …

七大开源基金会联合制定符合 CRA 法案的共同标准

欧洲议会上个月通过的《欧洲网络弹性法案》(CRA) 制定通用规范和标准 Apache 软件基金会、Blender 基金会、Eclipse 基金会、OpenSSL 软件基金会、PHP 基金会、Python 软件基金会 和 Rust 基金会 这项工作由 Eclipse 基金会牵头&#xff0c;旨在建立基于现有开源最佳实践的安全…

yolov8训练流程

训练代码 from ultralytics import YOLO# Load a model model YOLO(yolov8n.yaml) # build a new model from YAML model YOLO(yolov8n.pt) # load a pretrained model (recommended for training) model YOLO(yolov8n.yaml).load(yolov8n.pt) # build from YAML and tr…

巧用lambda表达式构建各种“树”

简述 利用jdk8 lambda表达式分组函数&#xff0c;可巧妙构建各种树&#xff0c;比如地区树&#xff0c;可以利用其多线程特性充分利用CPU提高性能。 分组函数&#xff1a;Collectors.groupingBy() 开起多线程&#xff1a;list.parallelStream() 实例 以地区为例&#xff1…

9.图像中值腐蚀膨胀滤波的实现

1 简介 在第七章介绍了基于三种卷积前的图像填充方式&#xff0c;并生成了3X3的图像卷积模板&#xff0c;第八章运用这种卷积模板进行了均值滤波的FPGA实现与MATLAB实现&#xff0c;验证了卷积模板生成的正确性和均值滤波算法的MATLAB算法实现。   由于均值滤波、中值滤波、腐…

leet hot 100-13 最大子数组和

53. 最大子数组和 原题链接思路代码 原题链接 leet hot 100-10 53. 最大子数组和 思路 生成一个数字来记录last 表示前面数字全部之和与0取最大值 如果大于0 就加上如果不大于0 就不管 从当前位置从新开始遍历计算 时间复杂度O(n) 空间复杂度(1) 代码 class Solution {…