当前位置: 首页 > news >正文

PHP:点击/拖动-上传图片文件目录,并存入数据库

一、效果 

实现效果,可点击选择文件按钮/直接将文件拖动到虚线框中选择文件

二、主页面实现

1、引入文件

在主页面upload.php界面中引入上传图片的文件,数据库连接的文件,连接数据

2、 视图层

实现主页面上传图片的视图层效果

标题+文件的form表单

3、样式层

主要使用样式,实现:页面布局、间距、边框等效果

4、逻辑层-js

实现了一个支持拖放上传和点击上传的图片上传功能,适用于现代 Web 应用。它结合了 HTML5 的拖放 API 和 FormData 对象,通过 AJAX 提交表单数据,并在前端动态显示上传进度和结果。

(1). 获取 DOM 元素

const dropArea = document.getElementById('dropArea');
const fileInput = document.getElementById('avatar');
const preview = document.getElementById('preview');
  • 作用 :获取页面中的关键元素。
    • dropArea:拖放区域,用户可以将文件拖放到这里。
    • fileInput:隐藏的文件输入框,用于选择文件。
    • preview:用于显示上传图片的预览。

(2). 拖放事件监听

['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {dropArea.addEventListener(eventName, preventDefaults, false);
});
function preventDefaults(e) {e.preventDefault();
    e.stopPropagation();
}
  • 作用 :处理拖放事件,确保浏览器不会执行默认行为(如打开文件)。
    • preventDefaults 函数阻止了默认的拖放行为,防止文件被直接打开。
    • 监听的事件包括:
      • dragenter:当拖动的文件进入目标区域时触发。
      • dragover:当拖动的文件在目标区域上方移动时触发。
      • dragleave:当拖动的文件离开目标区域时触发。
      • drop:当文件被释放到目标区域时触发。

(3). 拖放区域样式变化

['dragenter', 'dragover'].forEach(eventName => {dropArea.addEventListener(eventName, () => dropArea.classList.add('dragover'), false);
});
['dragleave', 'drop'].forEach(eventName => {dropArea.addEventListener(eventName, () => dropArea.classList.remove('dragover'), false);
});
  • 作用 :动态改变拖放区域的样式,提升用户体验。
    • 当文件拖入区域时,添加 dragover 样式类(例如改变边框颜色)。
    • 当文件离开或被释放时,移除 dragover 样式类,恢复原样。

(4). 处理拖放文件

dropArea.addEventListener('drop', handleDrop, false);
function handleDrop(e) {const dt = e.dataTransfer;const files = dt.files;if (files.length > 0) {fileInput.files = files; // 将拖放的文件赋值给隐藏的文件输入框handleFile(files[0]);}
}
  • 作用 :处理用户拖放的文件。
    • e.dataTransfer.files 获取拖放的文件列表。
    • 如果文件存在,将其赋值给隐藏的文件输入框(fileInput),并调用 handleFile 函数处理文件预览。

(5). 处理文件选择

fileInput.addEventListener('change', function(e) {const file = e.target.files[0];if (file) {handleFile(file);}
});
  • 作用 :监听文件输入框的变化事件。
    • 当用户通过点击选择文件时,获取选中的文件并调用 handleFile 函数进行预览。

(6). 文件预览

function handleFile(file) {const reader = new FileReader();reader.onload = function(event) {preview.src = event.target.result;preview.style.display = 'block';};reader.readAsDataURL(file);
}
  • 作用 :生成文件的预览图。
    • 使用 FileReader 读取文件内容。
    • 读取完成后,将文件的 Base64 数据赋值给 <img> 元素的 src 属性,从而显示图片预览。

(7). 表单提交

document.getElementById('uploadForm').addEventListener('submit', function(e) {e.preventDefault();const formData = new FormData(this);const messageDiv = document.getElementById('message');messageDiv.innerHTML = '上传中...&#

相关文章:

  • vc++ 如何调用poco库
  • 深入理解C++ 中的list容器
  • python四级考试经验(考生必看)
  • 风光储能+智能调度,这才是企业未来能源管理的最优解
  • velero备份与恢复流程是什么?
  • 《WebGIS之Vue零基础教程》(5)计算属性与侦听器
  • 如何利用CST把PCB的S参数生成Spice电路模型
  • Java常用API详解
  • Shell脚本-for循环语法结构
  • VLA 论文精读(十九)Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware
  • 深度解析之算法之分治(快排)
  • 【金仓数据库征文】——选择金仓,选择胜利
  • 区块链如何达成共识:PoW/PoS/DPoS的原理、争议与适用场景全解
  • 从线性到非线性:简单聊聊神经网络的常见三大激活函数
  • STM32MPU开发之旅:从零开始构建嵌入式Linux镜像
  • 《深入理解 AOP》
  • 【金仓数据库征文】-金仓数据库性能调优 “快准稳” 攻略:实战优化,让数据处理飞起来
  • 新闻速递丨Altair 与 Databricks 达成合作,加速数据驱动型创新
  • 银发科技:AI健康小屋如何破解老龄化困局
  • Qt知识点1『16进制数值与文本互相转换』
  • 美联合健康集团高管枪杀案嫌疑人对谋杀指控不认罪
  • 广州多条BRT相关线路将停运,全市BRT客运量较高峰时大幅下降
  • 秦洪看盘|短线热点降温,A股回落整固
  • 三部门提出17条举措,全力促进高校毕业生等青年就业创业
  • 政治局会议:根据形势变化及时推出增量储备政策,加强超常规逆周期调节
  • 专访|白俄罗斯共产党中央第一书记瑟兰科夫:只有大家联合起来,才能有效应对当前危机所带来的冲击