新手应该知道的php多图片上传的实现

新手应该知道的php多图片上传的实现

今天在工作中遇到了一个需求:一个表单实现多个上传图片,类似于QQ空间上传照片的模式。即:可以一次性上传多个图片,但是封面图片只有一个。

最先,最重要的事,在服务器上对文件进行读写操作的时候,一定要看权限,如果没有权限,全是虾扯蛋,为什么这样说,因为全是泪。

首先,前端页面:index.html

  1. <html>
  2. <head><title>多个文件上传表单</title></head>
  3. <body>
  4. <style>
  5. form{
  6. margin: 20px;
  7. padding: 10px;
  8. }
  9. #picInput>input{
  10. display: block;
  11. margin: 10px;
  12. }
  13. </style>
  14. <form action="pic.php" method="post" enctype="multipart/form-data">
  15. <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
  16. <div >
  17. 上传图片:<input type="file" name='myfile[]'>
  18. </div>
  19. <input type="button" οnclick="addPic1()" value="继续添加图片"><br/><br/>
  20. <input type="submit" value="上传文件">
  21. </form>
  22. <script>
  23. function addPic1(){
  24. var addBtn = document.getElementById('addBtn');
  25. var input = document.createElement("input");
  26. input.type = 'file';
  27. input.name = 'myfile[]';
  28. var picInut = document.getElementById('picInput');
  29. picInut.appendChild(input);
  30. if(picInut.children.length == 3){
  31. addBtn.disabled = 'disabled';
  32. }
  33. }
  34. </script>
  35. </body>
  36. </html>

知识点:

1.通过JS动态添加input结点和设置属性,当大于3个上传图片的时候就不再给予上传图片的机会了。

2.这里最主要的是input输入框的name值,通过动态的添加数组元素,将所有上传的图片动态添加到数组当中。

后端处理功能

Connection.php

1.读取和存储都需要用到连接数据库,所以可以把它封住一下,养成良好的习惯

  1. <?php
  2. //创建对象并打开连接,最后一个参数是选择的数据库名称
  3. $mysqli = new mysqli('localhost','root','','test');
  4. //检查连接是否成功
  5. if (mysqli_connect_errno()){
  6. //注意mysqli_connect_error()新特性
  7. die('Unable to connect!'). mysqli_connect_error();
  8. }

pic.php处理功能

  1. <?php
  2. require_once 'connection.php';
  3. $file = $_FILES['myfile']; //得到传输的数据,以数组的形式
  4. $name = $file['name']; //得到文件名称,以数组的形式
  5. $upload_path = "zhouqi666.cn/test/images/"; //上传文件的存放路径
  6. //当前位置
  7. foreach ($name as $k=>$names){
  8. $type = strtolower(substr($names,strrpos($names,'.')+1));//得到文件类型,并且都转化成小写
  9. $allow_type = array('jpg','jpeg','gif','png'); //定义允许上传的类型
  10. //把非法格式的图片去除
  11. if (!in_array($type,$allow_type)){
  12. unset($name[$k]);
  13. }
  14. }
  15. $str = '';
  16. foreach ($name as $k=>$item){
  17. $type = strtolower(substr($item,strrpos($item,'.')+1));//得到文件类型,并且都转化成小写
  18. if (move_uploaded_file($file['tmp_name'][$k],$upload_path.time().$name[$k])){
  19. //$str .= ','.$upload_path.time().$name[$k];
  20. echo 'success';
  21. }else{
  22. echo 'failed';
  23. }
  24. }
  25. //向指定id插入图片地址(虽然是插入,但是是更新字段,不要迷糊了)
  26. $uid = 1;
  27. $str = substr($str,1);
  28. $sql = "UPDATE upload set pic = '".$str."' WHERE id = ".$uid;
  29. $result = $mysqli->query($sql);

这里我有很多的判断没有写,主要是实现一下功能,比如文件夹要先建立好,你也可以自己判断,不存在就创建一个文件夹,还有一些其他判断等等。

最关键的地方是,当你不熟悉的时候,要走一步调试一步,看得到的结果是什么。

图片现实功能

  1. <?php
  2. require_once 'connection.php';
  3. $uid = 1;
  4. $sql = "SELECT pic FROM upload WHERE id =".$uid;
  5. $result = $mysqli->query($sql);
  6. //取出第一个图片的地址
  7. $picpath = '';
  8. while ($row = $result->fetch_array()){
  9. $picpath = $row[0];
  10. }
  11. $picpath = explode(',',$picpath)[0];
  12. echo "<img src='".$picpath."'>";
  13. ?>

感谢大家的阅读,希望大家收益多多。