PHP 文件上传

发布于:2025-07-23 ⋅ 阅读:(13) ⋅ 点赞:(0)

使用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 } = Vue
        createApp({
            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.value
                    for (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


网站公告

今日签到

点亮在社区的每一天
去签到