原生JavaScript+PHP多图上传实现

news2025/1/21 12:20:02

摘要

很多场景下需要选择多张图片上传,或者是批量上传以提高效率,多图上传的需求自然就比较多了,本文使用最简单的XMLHttpRequest异步上传图片。

界面

在这里插入图片描述

上传示例

在这里插入图片描述

代码

index.html

<!DOCTYPE html>
<html>
	<head>
		<title>多图上传</title>
		<meta charset="utf-8">
		<style>
		    #fileInput{
		        width: 500px;
		        height: 45px;
		        margin: 50px auto 0;
		        background: #eee;
		        display: block;
		        padding: 20px 20px;
		        border-radius: 20px;
		    }
		    #previewContainer{
		        width: 500px;
		        margin: 10px auto;
		        background: #eee;
		        padding: 20px 20px;
		        display: none;
		    }
			.preview-image {
              max-width: 200px;
              max-height: 200px;
              margin-bottom: 10px;
            }
        </style>
	</head>
	<body>
	    
	    <!--选择文件-->
		<input type="file" id="fileInput" accept="image/*" multiple>
		<div id="previewContainer"></div>
		
		<script>
			const fileInput = document.getElementById('fileInput');
			const previewContainer = document.getElementById('previewContainer');
			
            // 监听选择文件
			fileInput.addEventListener('change', handleFileSelect);
			
            function handleFileSelect(event) {
                const files = event.target.files;
            
                for (let i = 0; i < files.length; i++) {
                    const file = files[i];
                    const reader = new FileReader();
            
                    reader.onload = function(event) {
                        const image = document.createElement('img');
                        image.className = 'preview-image';
                        image.src = event.target.result;
                        previewContainer.appendChild(image);
                        
                        // 将文件上传至服务器
                        uploadImage(file);
                    }
                    
                    reader.readAsDataURL(file);
                }
            }
			
            // 将文件上传至服务器
            function uploadImage(file) {
                const xhr = new XMLHttpRequest();
                const formData = new FormData();
                
                // 将文件添加到formData对象
                formData.append('image', file);
                
                // 设置XHR请求的处理函数
                xhr.onreadystatechange = function() {
                    
                    if (xhr.readyState === XMLHttpRequest.DONE) {
                        if (xhr.status === 200) {
                            
                            console.log('上传成功');
                            
                            // 显示图片预览区域
                            document.querySelector('#previewContainer').setAttribute('style', 'display:block');
                            
                            // 打印JSON
                            console.log(JSON.parse(xhr.response))
                            
                        } else {
                            
                            console.log('上传失败');
                        }
                    }
                }
            
                // 发送POST请求到服务器
                xhr.open('POST', 'upload.php', true);
                xhr.send(formData);
                
            }
		</script>
	</body>
</html>

upload.php
(请建立一个upload文件夹以存放上传的文件)

<?php

    // 编码
    header("Content-type:application/json");

    // 检查是否有文件上传
    if (isset($_FILES['image'])) {
    
        // 获取上传的文件信息
        $file = $_FILES['image'];
        
        // 获取文件名
        $fileName = $file['name'];
        
        // 获取文件的临时路径
        $tmpFilePath = $file['tmp_name'];
        
        // 指定保存目录
        $uploadDir = 'upload/';
        
        // 验证是否为图片文件
        if ((($_FILES["image"]["type"] == "image/gif")
        || ($_FILES["image"]["type"] == "image/jpeg")
        || ($_FILES["image"]["type"] == "image/jpg")
        || ($_FILES["image"]["type"] == "image/pjpeg")
        || ($_FILES["image"]["type"] == "image/x-png")
        || ($_FILES["image"]["type"] == "image/png"))
        && ($_FILES["image"]["size"] < 10485760)){
            
            // 生成唯一的文件名
            $uniqueFileName = uniqid() . '_' . $fileName;
            
            // 拼接保存路径
            $uploadPath = $uploadDir . $uniqueFileName;
            
            // 获取HTTP协议
            function get_http_type(){
                $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
                return $http_type;
            }
            
            // 将临时文件移动到目标路径
            if (move_uploaded_file($tmpFilePath, $uploadPath)) {
                
                    // 上传成功
                    // 可以在此处进行进一步处理,比如生成缩略图、添加水印等
                    $result = array(
                        'code' => 200,
                        'msg' => '上传成功',
                        'url' => get_http_type().dirname($_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']).'/'.$uploadPath
                    );
            } else {
                    
                    // 上传失败
                    $result = array(
                        'code' => 202,
                        'msg' => '文件上传失败'
                    );
            }
        }else{
            
            // 不合规的文件
            $result = array(
                'code' => 202,
                'msg' => '不合规的文件'
            );
        }
        
    } else {
        
        // 没有文件上传
        $result = array(
            'code' => 202,
            'msg' => '没有选择要上传的文件'
        );
    }
    
    // JSON
    echo json_encode($result, JSON_UNESCAPED_UNICODE);
?>

作者

TANKING

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

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

相关文章

node.js下载安装环境配置以及快速使用

目录 一、下载 二、安装 三、测试安装是否成功 四、配置环境 五、测试配置环境是否成功 六、安装淘宝镜像 七、快速上手 1、建立一个自己的工作目录 2、下载工作代码 八、各种配置文件匹配问题入坑 九、总结 一、下载 Node.js 中文网 想选择其他版本或者其他系统使用…

【Chrome】chrome浏览器未连接到互联网

问题描述 电脑上安装了一个联想电脑管家&#xff0c;进行了一下清理&#xff0c;并优化了一下启动项&#xff0c;Chrome浏览器突然什么网站都无法访问了。以为更新坏了&#xff0c;但相同的网站放到火狐浏览器上&#xff0c;竟然可以打开&#xff0c;怎么回事呢&#xff1f;怎…

使用EMgu检测人脸

1,安装EMgu 在NuGet中,查找并安装EMgu 2,做人脸检测 首先,声明几个重要的类 //Thread.Sleep(3000);matImg = new Mat();capture.Retrieve(matImg, 0); frame=new Image<Bgr, byte>(matImg.Bitmap); 当,frame != null时,检测到人脸 3,给人脸画框 i…

MySQL主从分离读写复制

在高负载的生产环境里&#xff0c;把数据库进行读写分离&#xff0c;能显著提高系统的性能。下面对MySQL的进行读写分离。 试验环境 A机&#xff1a;IP:192.168.0.1 mysql版本&#xff1a;mysql-5.6.4,主数据服务器&#xff08;只写操作&#xff09; B机&#xff1a;IP:192.…

SpringMVC_执行流程

四、SpringMVC执行流程 1.SpringMVC 常用组件 DispatcherServlet&#xff1a;前端控制器&#xff0c;用于对请求和响应进行统一处理HandlerMapping&#xff1a;处理器映射器&#xff0c;根据 url/method可以去找到具体的 Handler(Controller)Handler:具体处理器&#xff08;程…

SpringMVC实现增删改查

文章目录 一、配置文件1.1 导入相关pom依赖1.2 jdbc.properties&#xff1a;配置文件1.3 generatorConfig.xml&#xff1a;代码生成器1.4 spring-mybatis.xml &#xff1a;spring与mybatis整合的配置文件1.5 spring-context.xml &#xff1a;上下文配置文件1.6 spring-mvc-xml:…

uni-app 之 获取网络列表数据

uni-app 之 获取网络列表数据 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- uni.request 网络请求API接口 ---<view v-for"(item) in caturl" :key&…

学信息系统项目管理师第4版系列05_组织通用管理

1. 流程管理 1.1. 流程是组织运行体系的框架基础&#xff0c;流程框架的质量影响和决定了整个组织运行体系的质量 1.2. 流程是指工作活动流转的过程 1.2.1. 流程可以是跨部门、跨岗位工作活动流转的过程 1.3. 业务流程是一组将输入转化为输出的相互关联或相互作用的活动 1…

NPM 常用命令(六)

1、npm explain 1.1 命令使用 npm explain <package-spec>别名: why 1.2 描述 此命令将打印导致在当前项目被其他引用包的依赖链。 如果提供了一个或多个包规范&#xff0c;则只有与其中一个说明符匹配的包才会解释它们的关系。 包规范还可以引用 ./node_modules 中…

Typescript技术分享

1、初识TypeScript TypeScript是什么&#xff1f; TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集。TypeScript 在 JavaScript 的基础上添加了可选的静态类型和基于类的面向对象编程。 2、TS类型 2.1 布尔类型(boolean) boolean类型只有两个取…

重建与发展:数字资产借贷行业朝着可持续发展迈进!

纵观历史&#xff0c;贷款和货币一样古老&#xff0c;无论哪种形式的货币都需要有其借贷市场。现在&#xff0c;比特币以其分散和透明的性质&#xff0c;在加密领域占据龙头地位。 就像之前的货币一样&#xff0c;比特币要真正蓬勃发展&#xff0c;也需要一个强大的借贷市场。然…

2023计算机毕业设计题目 毕设选题大全

文章目录 0 前言1 java web 管理系统 毕设选题2 java web 平台/业务系统 毕设选题3 游戏设计、动画设计类 毕设选题 (适合数媒的同学)4 算法开发5 数据挖掘 毕设选题6 大数据处理、云计算、区块链 毕设选题7 网络安全 毕设选题8 通信类/网络工程 毕设选题9 嵌入式 毕设选题10 开…

数据中心的未来是什么?

数据中心作为数字化经济的基础设施&#xff0c;在未来的发展中将会呈现出以下几个趋势和变化&#xff1a;多云环境的普及&#xff1a;未来的数据中心将会逐渐实现多云环境的兼容和协同&#xff0c;支持从公共云、私有云到混合云的多重部署模式。多云化环境将提供更多的选择和灵…

Matlab图像处理-最大类间方差阈值选择法(Otsu)

基本思想 最大类间方差阈值选择法又称为Otsu 算法&#xff0c;该算法是在灰度直方图的基础上用最小二乘法原理推导出来的&#xff0c;具有统计意义上的最佳分割阈值。它的基本原理是以最佳阈值将图像的灰度直方图分割成两部分&#xff0c;使两部分之间的方差取得最大值&#x…

全球城市汇总【最新】

文章目录 案例图国家城市大洲 数据 全球城市、国家、介绍汇总。包含 .csv .sql .xml 格式数据。 案例图 国家 城市 大洲 数据 获取上图资源绑定 https://blog.csdn.net/qq_40374604/category_12435042.html 如找不到在合集中查找。

【web开发】3、Bootstrap基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Bootstrap是什么&#xff1f;二、使用步骤1.引入Bootstrap2.Bootstrap常用全局 CSS 样式介绍与示例布局容器栅格系统排版代码表格表单按钮图片辅助类3.Bootstra…

JUC P8 ThreadLocal 基础+代码

JUC P8 ThreadLocal 基础代码 教程&#xff1a;https://www.bilibili.com/video/BV1ar4y1x727?p100 引出问题 ThreadLocal 和 TreadLocalMap 数据结构关系&#xff1f; ThreadLocal 中的 key 是弱引用&#xff0c;为什么&#xff1f; ThreadLocal 内存泄漏问题是什么&#x…

git标签基础

打标签:git可以给仓库历史中某个提交打上标签,以示重要,比较有代表人们会使用这个功能来标记发布结点(V1.0,V2.0) 列出本地标签: git tag --list git tag -l "V1.85*" 列出远端仓库的中所有标签 git ls-remote --tags给标签添加一些描述信息 git tag -a v1.3 -m …

Amazon Fargate 使用 Seekable OCI 实现更快的容器启动速度

虽然在部署和扩展应用程序时&#xff0c;使用容器进行开发的方式已日趋流行&#xff0c;但仍有一些领域可以改进。扩展容器化应用程序的主要问题之一是启动时间长&#xff0c;尤其是在纵向扩展期间&#xff0c;需要添加较新的实例。此问题可能会对客户体验&#xff08;例如&…

AST还原实战|第二届猿人学js逆向比赛第三题混淆还原详解

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01; 1. 目标地址 https://match2023.yuanrenxue.cn/topic/3 其加密参数tok…