PHP上传多张图片预览并回显,支持PC端与移动端

这几天在做一个小项目,其中有一个功能是php上传多张图片并且要有预览,回显,删除等功能。支持PC端与移动端。

上传文件我们第一时间想到的是表单里面的type=file方法。没错,我们就是用这种方法来实现。

我查网上资料的时候,很多用ajax来提交数据,这里我们直接用submit按钮来实现,很传统,适合小白学习用,也可用于项目当中。
首先来看看代码:

<input class="uploadImg" type="file" name="file[]" multiple id="file" accept="image/jpeg ,image/png,image/gif">

解释:

multiple 代表是可以上传多张图,如果没有只能单张图片。
name=“file[]” 代表可以获取多个图片数组,如果只是name=“file”,只能获取一个图片。
accept 代表接受上传的文件类型,这里我们只接受jpg,png,gif,其他不支持。
效果图:
默认的上传界面
接下来我们来美化一下上传的界面,我们用一张图片代替
效果图:
点击中间的相击就可以添加多张图片
一、整个css代码如下(包括回显的CSS):

.uploadImgBtn {
width: 100px;
height: 100px;
cursor: pointer;
position: relative;
background: url("images/pic.jpg") no-repeat;
-webkit-background-size: cover;
background-size: cover;
margin-top:10px;
float:left;
}
.uploadImgBtn .uploadImg {
position: absolute;
right: 0;
top:0;
width: 100%;
height: 100%;
opacity: 0;
cursor: pointer;
}
//这是一个用做回显的盒子的样式
.uppic .pic{
width: 100px;
height: 100px;
float:left;
}
.uppic .pic img {
width: 100px;
height: 100px;
float:left;
margin-left:1px;
margin-top:10px
}
.uppic .pic span{
background:url('images/close.png') no-repeat;
width:20px;
height:20px;
color:#fff;
text-align:center;
border-radius:50%;
position:absolute;
margin-left:-15px;
margin-top:5px;
cursor: pointer;
}

二、html界面的代码如下:

<div class="field field-text-field col-sm-12" data-type="TextField" >
<div class="form-group" >
<div class="field-label-container">
<label class="field-label font-family-inherit" >
健康码拍照上传(选择上传图片(最多5个)、限制每个10MB以内)
</label></div>
<div class="field-content uppic" id="uppic">
<div class="uploadImgBtn" id="uploadImgBtn">
<input class="uploadImg" type="file" name="file[]" multiple id="file" accept="image/jpeg ,image/png,image/gif">
</div>
</div>
</div>
</div>

回显示问题我们用JS来处理,JS处理流程我们来分析一下:

1.通过点击上传事件(上图那个相机按钮), 在点击事件里面我们处理一下file,我们用on()方法添加的change事件,判断file有没有被改变,如果改变了,说明你已经选了一个或多个图片了。

2.通过JS创建DOM标签,比如:div img等,把它把放到该显示的位置。

3.把上传的图片的file的结果传值给img标签中的src属性。这样就达到了回显的效果了。

4.最后每次上传图片时,让它自动生成一个及清除之前写死的id

简单来讲就是四步:
1、先获取input标签
2、给input标签绑定change事件
3、把图片回显
4、自动生成一个表单file

三、整个JS代码如下:

$(document).ready(function(){
//为外面的盒子绑定一个点击事件
$("#uploadImgBtn").click(function(){
//1、先回去input标签
var $input = $("#file");
//2、给input标签绑定change事件
$input.on("change" , function(){
//3、回显
$.each(files,function(key,value){
//每次都只会遍历一个图片数据
var div = document.createElement("div"),
img = document.createElement("img");
div.className = "pic";
var fr = new FileReader();
fr.onload = function(){
img.src=this.result;
div.appendChild(img);
document.getElementById("uppic").appendChild(div);
}
fr.readAsDataURL(value);
})
})
//4、我们把当前input标签的id属性remove
$input.removeAttr("id");
var newInput = '<input class="uploadImg" type="file" name="file[]" multiple id="file" accept="image/jpeg ,image/png,image/gif">';
$(this).append($(newInput));
})
})

上传效果图:
在这里插入图片描述
四、最后就是submit提交之后保存上传的图片到本地

提交之后,接收到的是一个数组,长什么样呢?如下:
在这里插入图片描述
分析一下这个结构:

我们的文件名在name中,图片的类型在type中,临时文件名在tmp_name中,错误信息在error中,0代表没有问题,文件的大小在size中,单位是B。

多个图片的话,我们必须要循环出来才行,可以用foreach()

处理原理步骤分析:

1.通过$File = $_FILES[‘file’];接收所有上传的图片

2.foreach()循环出所有的file信息

3.判断是不是图片或大小是不是符合要求,用if判断一下

4.用file_exists来检查下有没有重名

5.用move_uploaded_file将图片保存到本地

整个接收的代码如下:

<?php
$File = $_FILES['file'];
$strr="";
print_r("<pre>");
print_r($File);
foreach( $File['name'] as $Key => $FileName ) {
$FileNames = $FileName; //上传的文件来名
$FileTypes = $File['type'][$Key];//上传的文件类型
$FileSize = $File['size'][$Key];//上传的文件大小
$FileTmps = $File['tmp_name'][$Key]; //上传的文件副本
//判断图片上传有没有错误
if($FileNames)
{
//如果没有错误,判断条件是不是图片
if(($FileTypes=="image/png"||$FileTypes=="image/jpeg") && $FileSize<10240000)
{
//防止文件重名
$path="/upload/jiankang_ma/".time().$FileNames;
$re_path=str_replace(',','',$path);
$path_filename=$_SERVER['DOCUMENT_ROOT'].$re_path;
$path_filename=iconv("UTF-8","gb2312",$path_filename);
if(file_exists($path_filename)){
echo "<script>alert('你上传的图片重名了');history.back();</script>";
exit;
}else{
//保存图片文件,用move_uploaded_file将上传的文件移动至新位置
if(move_uploaded_file($FileTmps,$path_filename)){
echo "<script>alert('上传成功了');history.back();</script>";
}else{
echo "<script>alert('上传错误,请重新上传!');history.back();</script>";
exit;
}
}
}else{
echo "<script>alert('你上传的图片格式不对!');history.back();</script>";
exit;
}
}
}
?>

最后你可以将图片的地址保存到数据库中,这里就不讲解了,你们有什么问题可以直接找我,一起探讨,一起解决。

最后希望得到您的关注、转发、点赞、支持。

这里有一个弊端,就是如果我传错了,能不能删除后再上传,未来我会通过ajax来解决这个问题。

要使用element-plus、ts和vue3实现上传多张图片回显,可以按照以下步骤操作: 1. 首先,安装element-plus和vue3的相关依赖。可以使用npm或yarn安装element-plus和vue3的依赖包。 2. 在项目中创建一个上传组件,可以使用element-plus提供的el-upload组件实现。在组件中,引入和注册el-upload组件。 3. 组件中,声明一个data属性,用于存储图片文件和回显图片列表。可以使用ref或reactive创建响应式数据。 4. 在template模板中,使用el-upload组件,设置一些必要的属性,如action、listType和multiple等。通过action属性指定上传的地址,listType属性设置为"picture-card"以展示上传图片,并且通过multiple属性支持上传多张图片。 5. 设置el-upload组件的onSuccess和beforeRemove事件,用于在成功上传图片删除图片时触发相应的逻辑。在onSuccess事件中,将上传的文件添加到data属性中的图片文件列表中;在beforeRemove事件中,通过索引将要删除图片从data属性中的图片文件列表中移除。 6. 在组件中,使用v-for指令遍历图片文件列表,并使用el-image组件展示回显图片。el-image组件是element-plus提供的用于展示图片的组件。 7. 最后,在应用的父组件中,使用刚刚创建的上传组件。使用v-model指令绑定父组件中的数据,以获取上传成功后的图片文件。 通过以上步骤,就可以实现使用element-plus、ts和vue3上传多张图片回显的功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lizige2008

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值