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

PHP 文件上传

使用vue3处理js逻辑,可以使用js源码但是vue更方便。

表单注意事项:

  • enctype="multipart/form-data" 必须存在否则php后端接收不到$_FILES数据
  • form 表单直接使用form属性action和method会跳转到请求的php文件,使用js可以异步操作页面没有跳转
  • 上传多个文件,input name应该包含“[]”,否则后端仅识别最后提交的文件
  • 上传多个文件,input 应设置 multiple 属性
  • 表单中不设置button的type默认为submit,onclick可能不会被触发,所以要设置为button

js处理原理:

  1. 获取上传数据
  2. 上传时判断文件是否可上传,文件数据大于零,文件类型大小等
  3. post请求处理文档上传
  4. 输出上传结果

1 表单

<div id="app"><div><h1>UPLOAD</h1><div><form enctype="multipart/form-data">Send this file: <input  type="file" name="files[]" multiple @change="handleFileUpload" ref="selectedFileInput"/><button  type="button"  @click="submitFile">submit</button><button type="button"  @click="resetbtn">reset</button></form></div></div>
</div>

2 vue3请求

<script src="https://unpkg.com/vue@3.5.17/dist/vue.global.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script>const { createApp, ref,reactive,onMounted } = VuecreateApp({setup() {const selectedFile = ref(null);const selectedFileInput = ref(null)const handleFileUpload = (event) => {console.log(event);selectedFile.value = event.target.files; // 获取第一个选择的文件};const submitFile = () => {console.log(selectedFile.value)if (!selectedFile.value) {alert("请选择一个文件!");return;}_submitFile();}function _submitFile(){// 这里可以添加将文件发送到服务器的代码,例如使用FormData和XMLHttpRequest,或者使用axios等库。const formData = new FormData();let files = selectedFile.valuefor (var i = 0; i < files.length; i++) {formData.append('files[]', files[i]);}// formData.append('files', selectedFile.value);_doRequest(formData)}function _doRequest(formData){const url ="upload.php";// 示例使用axios发送文件axios.post(url, formData, {headers: {'Content-Type': 'multipart/form-data',// 'Sec-Fetch-Dest':'document'}}).then(response => {console.log('文件上传成功', response);selectedFile.value = null}).catch(error => {console.error('文件上传失败', error);});};function _doRequest2(formData){var xhr = new XMLHttpRequest();xhr.open('POST', 'upload.php', true);xhr.onload = function () {if (this.status >= 200 && this.status < 300) {console.log(this.response); // 处理响应} else {console.error('Upload failed.');}};xhr.send(formData);}const resetbtn = ()=>{console.log(selectedFileInput.value)if(selectedFileInput.value){const inputElement = document.querySelector('input[name="files[]"]');if (inputElement) {inputElement.value = null; // 重置文件输入selectedFile.value = null}}}onMounted(()=>{console.log(selectedFileInput.value)console.log(selectedFile.value)})return {submitFile,handleFileUpload,selectedFile,selectedFileInput,resetbtn}}}).mount('#app')</script>

3 PHP处理

通用方法 common.php

function uploadfile($file, $toPath = null, $usename = false) {$uploadDefaultPath = PATH_UPLOAD;if (empty($toPath)) {$toPath = $uploadDefaultPath;} else {$toPath = $uploadDefaultPath . "/" . $toPath;if (!is_dir($toPath)) {mkdir($toPath);}}$fromfilepath = $file['tmp_name']; //D:\document\files_upload_tmp_dir\php7C1.tm 临时文件$oldfilename = $file['name'];if (!is_uploaded_file($fromfilepath)) {return false;}$fielpathinfo = pathinfo($oldfilename);$extension = $fielpathinfo['extension'];$oldfilename = $fielpathinfo['filename'];$fielename = date('YmdHis', time()) . mt_rand();if ($usename) {$fielename = $oldfilename;}$fielename .= "." . $extension;$toPath = $toPath . "/" . $fielename;$result = move_uploaded_file($fromfilepath, $toPath);return $result;
}
function backjson($code, $msg, $data = []) {$data = ['code' => $code,'msg' => $msg,'data' => $data,];$str = json_encode($data, 304);exit($str);
}

业务处理 upload.php

include_once "common.php";define("PATH_UPLOAD", "./upload");
if ('POST' == $_SERVER['REQUEST_METHOD']) {if (isset($_FILES['files']) && count($_FILES['files']) > 0) {$files = $_FILES['files'];$fiels_arr = [];if (count($files['name']) >= 1) {foreach ($files['name'] as $key => $value) {$file_time = ['name' => $files['name'][$key],'type' => $files['type'][$key],'tmp_name' => $files['tmp_name'][$key],'error' => $files['error'][$key],'size' => $files['size'][$key],];$fiels_arr[] = $file_time;}} else {$fiels_arr[] = $files;}$success_count = 0;$error_list = [];foreach ($fiels_arr as $key => $value) {try {$result = uploadfile($value, "test", true);if ($result) {$success_count++;} else {throw new \Exception($valu['name'] . "上传失败");}} catch (\Exception $th) {$msg = $th->getMessage();$code = $th->getCode();$error_list[] = $msg;}}if (count($error_list) > 0) {$errormsg = implode(" ", $error_list);backjson(0, $errormsg);}backjson(1, "上传成功");}
}

参考

多文件上传

PHP: Uploading multiple files - Manual https://www.php.net/file-upload.multiple

http://www.lryc.cn/news/595699.html

相关文章:

  • Python----大模型(基于Fastapi+streamlit的机器人对话)
  • 自研能管项目开发界面
  • 【Linux基础知识系列】第五十六篇 - 使用File命令识别文件类型
  • 记一次flink资源使用优化
  • Java内部类与Object类深度解析
  • 聊聊登录接口的混合加密:AES+RSA双剑合璧
  • 【node】npm包本地开发与调试
  • 深入解析Hadoop中的Region分裂与合并机制
  • 关于集合的底层数据结构
  • 【C++进阶】揭秘list迭代器:从底层实现到极致优化
  • Pulsar存储计算分离架构设计之Broker无状态
  • 飞算科技:用AI与数智科技,为产业数字化转型按下“加速键”
  • 《声音分类模型》
  • 一、Vue概述以及快速入门
  • 深度学习 --- 激活函数
  • Datawhale 202507 夏令营:让AI学会数学推理
  • Ultralytics代码详细解析(四:engine->trainer.py 训练部分代码详解)
  • 架构演进核心路线:从离线仓库到实时湖仓一体
  • EMA《2025-2028年药品监管中的数据与AI 1.3版》信息分析
  • vscode不识别vsix结尾的插件怎么解决?
  • SQL 基础案例解析
  • Oracle RAC+ADG switchover 切换演练流程
  • 景区负氧离子监测设备:守护清新,赋能旅游
  • 操作符练习
  • 倍增算法与应用(倍增优化之ST表、LCA、功能图、树上差分、贪心、二分)
  • mybatis多对一一对多的关联及拼接操作以及缓存处理
  • 主流开源LLM架构对比与突破·
  • 【Qt开发】Qt的背景介绍(四)
  • 项目复盘核心要点
  • 网络安全基础作业三