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

news2024/11/17 23:50:04

🏠官网

点我前往

🥓依赖

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

    // 初始化Dropzone
    var 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 样式 -->
    <link
            rel="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>
    // 配置Dropzone
    Dropzone.options.myDropzone = {
        url: "/upload",
        method: "post",
        autoProcessQueue: false, // 设置为false,表示手动触发上传
        maxFilesize: 10, // 最大文件大小,单位为MB
        maxFiles: 3, // 最大上传文件数量
        acceptedFiles: ".jpg", // 允许上传的文件类型
        addRemoveLinks: true, // 显示移除文件的链接
        dictDefaultMessage: "拖放文件到这里或点击上传", // Dropzone区域的默认消息
        dictRemoveFile: "移除文件", // 移除文件链接的文本
        init: function() {
            this.on("removedfile", function(file) {
                // 移除文件时的操作
                console.log("文件 " + file.name + " 已被移除");
            });
        }
    };
    Dropzone.autoDiscover = false;

    // 初始化Dropzone
    var myDropzone = new Dropzone("#myDropzone", {
        url: "/upload",
        autoProcessQueue: false // 设置为false,表示手动触发上传
    });

    // 手动触发上传
    document.getElementById("uploadButton").addEventListener("click", function() {
        myDropzone.processQueue();
    });
</script>

</body>
</html>

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

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

相关文章

STL——vector容器基本使用与常用接口模拟实现

vector的介绍及使用 vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的…

自然语言处理NLP概述

大家好&#xff0c;自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将从自然语言处理的本质、原理和应用三个方面&#xff0c;对其进行概述。 一、NLP的本质 NLP是一种…

神经网络学习笔记10——RNN、ELMo、Transformer、GPT、BERT

系列文章目录 参考博客1 参考博客2 文章目录 系列文章目录前言一、RNN1、简介2、模型结构3、RNN公式分析4、RNN的优缺点及优化1&#xff09;LSTM是RNN的优化结构2&#xff09;GRU是LSTM的简化结构 二、ELMo1、简介2、模型结构1&#xff09;输入2&#xff09;左右双向上下文信…

【史上最细教程】 Typora+PicGo+Gitee 实现发给别人的Typora笔记也能看到图片

文章目录 问题描述前提准备&#xff1a;操作步骤&#xff1a;1.Gitee新建项目作为图床、获取仓库访问密钥2.PicGo连接Gitee图床3.Typora连接PicGo 问题描述 Typora记录的笔记&#xff0c;图片保存默认在本地&#xff0c;这时候复制出来上传CSDN、或发给别人的时候图片就是空链…

Qt 的发展历史、现状与启示

Qt 最早在1991年由挪威的两位程序员 Eirik Chambe-Eng 和 Haavard Nord 开发&#xff0c;他们在1994年创立 Trolltech 公司&#xff08;奇趣科技&#xff09;正式经营软件业务。Qt 的第一个公众预览版于1995年面世&#xff0c;之后在2008年被诺基亚收购&#xff1b;2011年到201…

【漏洞复现】万户 ezOFFICE wf_printnum SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Linux :进程的程序替换

目录 一、什么是程序替换 1.1程序替换的原理 1.2更改为多进程版本 二、各种exe接口 2.2execlp ​编辑 2.2execv 2.3execle、execve、execvpe 一、什么是程序替换 1.1程序替换的原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往…

【Redis系列】Redis安装与使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【群晖】NASTOOL-自动化处理影音视频工具

【群晖】NASTOOL-自动化处理影音视频 本文主要从获取、部署、使用、配置等方面进行手把手教学如何使用nastool工具进行影音视频自动化处理。从此靠别繁琐的网上各个网址找资源-下载-复制-改名-刮削等操作。 准备 DSM 7.1 &#xff08;我使用的是群晖 7.1 系统&#xff0c;不管…

JVM剖析

0.前言 Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括&#xff1a; Apache spark用于大数据处理&#xff0c;数据分析在JVM上运行;用于数据流的Apache NiFi在内部使用的也是 JVM;现代 Web 和移动应用程序开发中使用的React native使用 的也包含…

【代码篇】事件监听函数的内存泄漏,都给我退散吧!

前言 内存泄漏是个很严肃的问题&#xff0c;可是迄今也没有一个非常有效的排查方案&#xff0c;本方案就是针对性的单点突破。 工作中&#xff0c;我们会对window, DOM节点&#xff0c;WebSoket, 或者单纯的事件中心等注册事件监听函数, 添加了&#xff0c;没有移除&#xff…

网络爬虫:爬取假数据

网络爬虫&#xff1a;爬取假数据 文章目录 网络爬虫&#xff1a;爬取假数据前言一、项目介绍&#xff1a;二、项目来源&#xff1a;三、架构图&#xff1a;&#xff08;流程图&#xff09;四、使用了什么技术&#xff1a;&#xff08;知识点&#xff09;五、结果示意图&#xf…

网络安全 | 什么是单点登录SSO?

关注WX&#xff1a;CodingTechWork SSO-概念 单点登录 (SSO) 是一种身份认证方法&#xff0c;用户一次可通过一组登录凭证登入会话&#xff0c;在该次会话期间无需再次登录&#xff0c;即可安全访问多个相关的应用和服务。SSO 通常用于管理一些环境中的身份验证&#xff0c;包…

obs直播推流 + ffmpeg参数

OBS 启动参数设为 --startstreaming &#xff0c; 可以让它启动后自动开始直播 对应ffmpeg参数&#xff1a; echo off :loop ffmpeg -re -i a.mp4 -r 24 -c:v libx264 -preset ultrafast -profile:v baseline -g 24 -keyint_min 24 -x264-params nal-hrdcbr -b:v 2500k -minr…

线上研讨会 | 应对汽车毫米波雷达设计中的电磁挑战

智能汽车、新能源汽车最近几年一直是汽车行业关注的热点&#xff0c;随着5G技术越来越普及&#xff0c;汽车智能化发展将越来越迅速。从传统汽车到智能汽车&#xff0c;不是简单功能的增强&#xff0c;而是从单一功能的交通工具变成可移动的办公和娱乐空间&#xff0c;成为物联…

蓝桥杯python组真题练习1

目录 1.单词分析 2.成绩统计 3.门牌制作 4.卡片 5.跑步训练 6.蛇形填数 7.时间显示 1.单词分析 1.单词分析 - 蓝桥云课 (lanqiao.cn) s list(input()) maxx 0 for i in s:num s.count(i)if num>maxx:sm imaxx numif num maxx:if ord(sm)>ord(i):sm i print…

AcWing-孤独的照片

4261. 孤独的照片 - AcWing题库 所需知识&#xff1a;贡献法 整体思路&#xff1a;首先想到暴力枚举所有区间&#xff0c;判断每个区间内是否有一种牛的数量是一只&#xff08;提前用前缀和存放每个位置及以前的牛的数量&#xff09; C代码&#xff1a;&#xff08;过不了&a…

【科研笔记】知识星球不可选择内容爬虫

知识星球不可选择内容爬虫 1 背景2 实现3 拓展遗留问题1 背景 针对与知识星球中,电脑打开网页不可选择复制粘贴的问题,进行爬虫处理,获取网页的内容,并保存在本地 2 实现 需要下载python,和爬虫的第三方库selenium,可以查看博客中有关selenium的内容进行回顾。当前使用…

安装Pillow库的方法最终解答!_Python第三方库

安装Python第三方库Pillow 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 pillow库 Pillow库是一个非常强大的图像处理库。它提供了广泛的图像处理功能&#xff0c;让我们可以轻松地读取和保存图像、创建缩略图和合并到…

开源软件技术社区方案

开源软件技术社区是一个由开发者、贡献者、用户和维护者组成的共享平台&#xff0c;主要目的是打造技术、软件产品良性互动、开源技术安全可控的软件生态环境&#xff0c;实现可复用应用或服务的快速部署与使用、完成资源与能力的高度共享、促进社区成员的共建共赢&#xff0c;…