PHP實現圖片(檔案)上傳

喜洋洋咯發表於2019-06-27

這幾天整理做過的php專案,感覺這個經常會用到,傳上來共享一下咯
首先,前端介面
1、表單的首行需要加上enctype="multipart/form-data",需要上傳的圖片必須設定 type="file"表示選擇檔案

<form id="img_form" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
     <label class="col-sm-3 control-label" for="image">圖片:</label>
        <div class="col-sm-9 require">
            <input type="hidden" name="MAX_FILE_SIZE" value="2000000">//檔案最大尺寸
            <input type="file" class="form-control" name="image" id="image">
        </div>
    </div>
  </form>

2、為表單新增事件,我用的是ajax
因為圖片在是二進位制傳輸,所以需要用new FormData(this)獲取表單非文字類的資料(注包括文字類),純文字類資料可用$(this).serialize();

$('#form1').submit(function (e) {
    e.preventDefault();
     var data=new FormData(this);//獲取非文字類的資料
     $.ajax({
         url:"php/add.php",//處理頁面的路徑
         data:data,//通過json格式將一組資料傳過去
         type:"post",//資料的提交和傳遞方式,最好用POST
         dataType:"json",//頁面返回值的型別,共有三種:TEXT,JSON,XML可選
         cache:false,
         contentType:false,
         processData:false,
         success:function(res){//回撥函式:如果ajax呼叫成功,就執行這個success後面的函式,(data)當做引數返回過來
             if (res.flag===1){
                 alert('上傳成功!');
             } else if(res.flag===2){
                 alert('網路或其他未知錯誤,請重試!')
             }else{
                 alert('圖片格式錯誤,請重試!')
             }
         },
         error: function () {
             alert("error")
         }
     });
 });

3、編寫php檔案
connect.php
資料庫連線檔案

<?php
$link=new PDO("mysql:host=localhost;port=3306;dbname=db","root","");
$link->query("set names utf8");

add.php

  • extract($_POST):批量獲取前端post方式傳過來的資料,使用引數時引數名為前端傳過來的初始名。
  • in_array(search,array,type):搜尋陣列中是否存在指定的值,即元素是否存在與陣列,返回true或false。
    search,必需,規定要在陣列搜尋的值。array,必需,規定要搜尋的陣列。type,可選,如果設定該引數為 true,則檢查搜尋的資料與陣列的值的型別是否相同。
  • count():獲取陣列元素個數
  • $_FILES['image']['name']:'image'為前端圖片定義的name,後面的'name'不可變 PHP實現圖片(檔案)上傳

  • file_exists():檢查圖片是否存在資料夾,存在返回ture,否則false
    -upload:是我圖片上傳目標檔案

<?php
extract($_POST);
$date = date('Y-m-d');
$file_name = $_FILES['image']['name'];//獲取快取區圖片,格式不能變
$type = array("jpg", "gif", 'png', 'bmp');//允許選擇的圖片型別
$ext = explode(".", $file_name);//拆分獲取圖片名
$ext = $ext[count($ext) - 1];//取圖片的字尾名
if (in_array($ext,$type)){
    do{
        $new_name = get_file_name(6).'.'.$ext;
        $path='upload/'.$new_name;//upload為目標資料夾
    }while (file_exists("../" . $path));//檢查圖片是否存在資料夾,存在返回ture,否則false
    $temp_file=$_FILES['image']['tmp_name'];//獲取伺服器裡圖片
    include_once ('connect.php');//連線資料庫
    $result = $link->exec("INSERT INTO `news`(`title`,`author`, `content`, `src`,`time`) VALUES ('$title','$author','$content','$path','$date')");
    if ($result){
        move_uploaded_file($temp_file,"../" .$path);//移動臨時檔案到目標路徑
        $arr['flag']=1;
        $arr['detail']=[$title,$author,$content,$path];
    }else{
        $arr['flag']=2;
    }
}else{
    $arr['flag']=3;
}
function get_file_name($len)//獲取一串隨機數字,用於做上傳到資料庫中檔案的名字
{
    $new_file_name = 'A_';
    $chars = "1234567890qwertyuiopasdfghjklzxcvbnm";//隨機生成圖片名
    for ($i = 0; $i < $len; $i++) {
        $new_file_name .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $new_file_name;
}
echo json_encode($arr);

相關文章