1. 程式人生 > >PHP 圖片上傳 (AIP圖片上傳介面,視訊上傳同理,只需改動jpg,png等為mp4,flv等)

PHP 圖片上傳 (AIP圖片上傳介面,視訊上傳同理,只需改動jpg,png等為mp4,flv等)

PHP上傳的簡單案例:  

Html檔案:

複製程式碼
<html>

<form action="index.php" name="form" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" name="submit" value="上傳" />
</form>

</html>
複製程式碼

樣式相關:

  手機端,點選上傳按鈕,彈出相機:

    <input type="file" accept="image/*;capture=camera">直接呼叫相機
            <input type="file" accept="image/*" />呼叫相機 圖片或者相簿

PHP檔案:

複製程式碼
<?php

$file = $_FILES['file'];//得到傳輸的資料

//得到檔名稱
$name = $file['name'];
$type = strtolower(substr($name,strrpos($name,'.')+1)); //得到檔案型別,並且都轉化成小寫
$allow_type = array('jpg','jpeg','gif','png'); //定義允許上傳的型別
//判斷檔案型別是否被允許上傳
if(!in_array($type, $allow_type)){
    //如果不被允許,則直接停止程式執行
    return ;
}
//判斷是否是通過HTTP POST上傳的
if(!is_uploaded_file($file['tmp_name'])){ //如果不是通過HTTP POST上傳的 return ; } $upload_path = "./img/"; //上傳檔案的存放路徑 //開始移動檔案到相應的資料夾 if(move_uploaded_file($file['tmp_name'],$upload_path.$file['name'])){ echo "Successfully!"; }else{ echo "Failed!"; } ?>
複製程式碼

使用thinkphp上傳類上傳的簡單案例:

複製程式碼
    // 上傳配置資訊
    protected
$upconfig = array( 'maxSize' => 3145728, // 3M 'exts' => array('jpg', 'gif', 'png', 'jpeg'), 'rootPath' => './Public/Uploads/info/', 'savePath' => '', // => 上傳子目錄需要每個函式自己去設定 'saveName' => array('uniqid',''), 'autoSub' => false, // 關閉子目錄儲存 'subName' => array('date','Ymd'), ); protected function upload($file) { $res['result'] = 1; $res['imgurl'] = ''; $res['msg'] = ''; do { $ret = true;        //判斷路徑是否存在 $fullPath = $this->upconfig['rootPath'] . $this->upconfig['savePath']; if(!file_exists($fullPath)){ //如果不存在,建立資料夾 $ret = mkdir($fullPath, 0777, true); } if(!$ret) { // 上傳錯誤提示錯誤資訊 $res['result'] = 0; $res['msg'] = "建立儲存圖片的路徑失敗!"; break; } // 例項化上傳類 $upload = new \Think\Upload($this->upconfig); // 上傳單個檔案 $info = $upload->uploadOne($file);        // 上傳多個檔案          $info = $upload->upload();
if(!$info) {
                // 上傳錯誤提示錯誤資訊
                $res['result'] = 0;
                $res['msg'] = $upload->getError();
            } else {
                // 上傳成功 獲取上傳檔案資訊
                $imgurl =  $this->upconfig['rootPath'] . $info['savepath'].$info['savename'];
                $imgurl = str_replace('./', '/', $imgurl);
                $res['result'] = 1;
                $res['imgurl'] = $imgurl;
            }

        } while(0);

        return $res;
    }

        // 儲存上傳的檔案
        $res = $this->upload($_FILES['attorney']);
複製程式碼

移動端App上傳圖片例項:API介面:

問題:APP上傳頭像,php作為API端應該如何接收圖片資訊?

上傳部分的程式碼不是問題,主要是server端如何才能接收到APP端的圖片資訊。在B/S架構下,可以直接通過form表單設定enctype="multipart/form-data",$_FILES陣列中就有了圖片資訊。那麼在C/S模式中,也是如此嗎?

 解答1(見方式一)一般是採用二進位制流傳輸,客戶端傳的是二進位制,伺服器端接收,然後file_put_contents寫入檔案就可以了。檔名格式,檔案放哪裡,這些自己定義。

 解答2(見方式二):Android或者IOS客戶端模擬一個HTTP的Post請求到伺服器端,伺服器端接收相應的Post請求後(通過$_FILES獲取圖片資源),返回響應資訊給給客戶端。(這一種方式和獲取Html方式提交的方法一樣)

方式一:把圖片進行base64加密成字串,進行傳輸

說明:IOS或者安卓端:通過把圖片進行base64編碼得到字串,傳給介面

        介面端:把接收的字串進行base64解碼,再通過file_put_contents函式,上傳到指定的位置

複製程式碼
    /**
     * 圖片上傳
     * @param $imginfo - 圖片的資源,陣列型別。['圖片型別','圖片大小','圖片進行base64加密後的字串']
     * @param $companyid - 公司id
     * @return mixed
     */
    public function uploadImage( $imginfo , $companyid ) {
        $image_type = strip_tags($imginfo[0]);  //圖片型別
        $image_size = intval($imginfo[1]);  //圖片大小
        $image_base64_content = strip_tags($imginfo[2]); //圖片進行base64編碼後的字串

        $upload = new UploaderService();
        $upconfig = $upload->upconfig;

        if(($image_size > $upconfig['maxSize']) || ($image_size == 0)) {
            $array['status'] = 13;
            $array['comment'] = "圖片大小不符合要求!";
            return $array;
        }

        if(!in_array($image_type,$upconfig['exts'])) {
            $array['status'] = 14;
            $array['comment'] = "圖片格式不符合要求!";
            return $array;
        }

        // 設定附件上傳子目錄
        $savePath = 'bus/group/' . $companyid . '/';
        $upload->upconfig['savePath'] = $savePath;

        //圖片儲存的名稱
        $new_imgname = uniqid().mt_rand(100,999).'.'.$image_type;

        //base64解碼後的圖片字串
        $string_image_content = base64_decode($image_base64_content);

        // 儲存上傳的檔案
        $array = $upload->upload($string_image_content,$new_imgname);

        return $array;
    }
複製程式碼複製程式碼
    // 上傳配置資訊
    public $upconfig = array(
        'maxSize'    =>    3145728,         //3145728B(位元組) = 3M
        'exts'       =>    array('jpg', 'gif', 'png', 'jpeg'),
//        'rootPath'   =>    './Public/Uploads/info/',
        'rootPath'   =>    'https://www.eyuebus.com/Public/Uploads/info/',
    );

    /**
     * @param $string_image_content - 所要上傳圖片的字串資源
     * @param $new_imgname - 圖片的名稱,如:57c14e197e2d1744.jpg
     * @return mixed
     */
    public function upload($string_image_content,$new_imgname) {

        $res['result'] = 1;
        $res['imgurl'] = '';
        $res['comment'] = '';

        do {
            $ret = true;
            $fullPath = $this->upconfig['rootPath'] . $this->upconfig['savePath'];
            if(!file_exists($fullPath)){
                $ret = mkdir($fullPath, 0777, true);
            }
            if(!$ret) {
                // 上傳錯誤提示錯誤資訊
                $res['result'] = 12;
                $res['comment'] = "建立儲存圖片的路徑失敗!";
                return $res;
                break;
            }

            //開始上傳
            if (file_put_contents($fullPath.$new_imgname, $string_image_content)){
                // 上傳成功 獲取上傳檔案資訊
                $res['result'] = 0;
                $res['comment'] = "上傳成功!";
                $res['imgname'] = $new_imgname;
            }else {
                // 上傳錯誤提示錯誤資訊
                $res['result'] = 11;
                $res['comment'] = "上傳失敗!";
            }


        } while(0);

        return $res;
    }
複製程式碼

方式二:Android或者IOS客戶端模擬一個HTTP的Post請求到伺服器端,伺服器端接收相應的Post請求後(通過$_FILES獲取圖片資源),返回響應資訊給給客戶端。(這一種方式和獲取Html方式提交的方法一樣)

移動端需要請求一個URL,這個URL接收POST過去的資料,比如:http://www.apixxx.net/Home/Uploader/uploadPrepare

複製程式碼
    public function uploadPrepare() {
        $array = array();

        $post_log = print_r($_POST, true);
        Log::record($post_log, 'DEBUG');
        $file_log = print_r($_FILES, true);
        Log::record($file_log, 'DEBUG');


        $token = $_POST['token'];

        $token_str          = jwt_decode($token);
$user_type          = $token_str['user_type'];


        // 設定附件上傳子目錄
        if($user_type == 1) {
            $savePath = 'travel/group/' . $user_companyid . '/';
        }elseif ($user_type == 2) {
            $savePath = 'bus/group/' . $user_companyid . '/';
        }elseif ($user_type == 3) {
            $savePath = 'driver/group/' . $user_companyid . '/';
        }else {
            $array['status'] = 3;
            $array['comment'] = '非法使用者!';
            return $array;
        }
        $this->upconfig['savePath'] = $savePath;


        // 儲存上傳的檔案(單張)
//        $res = $this->upload($_FILES['file']);

    
        // 儲存上傳的檔案(多張) 移動端的表單name=“xxx[]”,支援多張圖片
        $res = $this->upload();

        $array['status'] = $res['status'];
        $array['comment'] = $res['comment'];
        $array['responseParameters']['img_url'] = $res['img_url'];

        echo json_encode($array);
    }



    protected function upload() {

        $res['status'] = 1;
        $res['imgurl'] = '';
        $res['comment'] = '';

        do {

            $ret = true;
            $fullPath = $this->upconfig['rootPath'] . $this->upconfig['savePath'];
            if(!file_exists($fullPath)){
                $ret = mkdir($fullPath, 0777, true);
            }
            if(!$ret) {
                // 上傳錯誤提示錯誤資訊
                $res['status'] = 1;
                $res['comment'] = "建立儲存圖片的路徑失敗!";
                break;
            }

            // 例項化上傳類
            $upload = new \Think\Upload($this->upconfig);

//            // 上傳單個檔案
//            $info = $upload->uploadOne($file);

            // 上傳多個檔案
            $infos = $upload->upload();

            // 上傳的圖片數量
            $file_count = 0;
            foreach ($_FILES as $file_k => $file_v) {
                foreach ($file_v["size"] as $k => $v) {
                    if($v == 0) {
                        continue;
                    }
                    $file_count += 1;
                }
            }

            Log::record("info_log", 'DEBUG');
            $info_log = print_r($infos,true);
            Log::record($info_log, 'DEBUG');

            if(!$infos) {
                // 上傳錯誤提示錯誤資訊
                $res['status'] = 2;
                $res['comment'] = $upload->getError();
            } else {
                // 獲取的上傳成功的圖片數量
                $info_count = 0;

                // 上傳成功 獲取上傳檔案資訊
                foreach($infos as $k => $v) {
                    $imgurl[$v['key']][] =  str_replace('./', '/', $this->upconfig['rootPath'] . $v['savepath'].$v['savename']);
                    $info_count += 1;
                }

                if($file_count != $info_count) {
                    $res['status'] = 1;
                    $res['comment'] = "上傳失敗!上傳的多張圖片,沒有全部上傳成功";
                }else {
                    $res['status'] = 0;
                    $res['comment'] = "上傳成功!";
                    $res['img_url'] = $imgurl;
                }
            }

        } while(0);

        return $res;
    }

複製程式碼
題外話,若伺服器有過多的類似這樣上傳,下載的請求,可使用nginx,nginx相比於apache,可處理的併發請求更多.具體可自行研究

友情提示:image/png  image/meg       video/mp4   video/flv....




更多問題,歡迎加群討論:qq群 :565191947

相關推薦

PHP 圖片 AIP圖片介面,視訊同理,改動jpgpngmp4flv)

PHP上傳的簡單案例:  Html檔案:<html> <form action="index.php" name="form" method="post" enctype="multipart/form-data"> <input ty

PHPCMS V9手機移動端圖片PHPCMS V9前臺使用layui的元件代替預設的SWFupload圖片

預設phpcms的上傳 圖片使用的是swfupload,導致手機移動端上傳圖片無法使用。這裡我們使用layui的上傳元件來使其支援手機移動端圖片上傳,效果圖如下:   實現步驟: 一、 開啟phpcms

AJAX+Servlet3.0實現非同步檔案單個檔案、多個檔案、帶檔案的表單提交)

   一、上傳單個檔案           1.JSP頁面程式碼       <%@ page language="java" contentType="text/html;

壓縮圖片的方法壓縮圖片的質量)

/** * 多執行緒壓縮圖片的質量 * @param image 記憶體中的圖片 * @param imgPath 圖片的儲存路徑 */ private void compressImage(final Bit

定義抽象類Shape抽象方法showArea()求出面積並顯示定義矩形類Rectangle,正方形類Square,圓類 Circle根據各自的屬性用showArea方法求出各自的面積在main方法中構造3個對象調用showArea方法。體現多態)

子類 protected new 都是 package 使用 類指針 3.1 shape 實現多態的三個條件:1.要有繼承2.要有抽象方法重寫3.用父類指針(引用)指向子類對象 重載重寫重定義的區別: 1.重載:在同一個類中進行;  編譯時根據參數類型和個數決定方法調用; 

給年份year定義一個巨集以判別該年份是否閏年。提示:巨集名可以定義LEAP_YEAR形參y既定義巨集的形式 #define LEAP_YEAR(y) 讀者設計的字串)

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int y=scanner.nextI

CF E. Vasya and a Tree】 dfs+樹狀陣列給你一棵n個節點的樹每個點有一個權值初始全0m次操作每次三個數(v, d, x)表示考慮以v根的子樹將所有與v點距離小於等於d的點權值全部加上x求所有操作完畢後所有節點的值)

題意: 給你一棵n個節點的樹,每個點有一個權值,初始全為0,m次操作,每次三個數(v, d, x)表示只考慮以v為根的子樹,將所有與v點距離小於等於d的點權值全部加上x,求所有操作完畢後,所有節點的值   首先要明確兩件事情性質1.每個人的操作只會影響到他的子孫(包括自己) 性質1.每個人的操

Android Multimedia實戰四)MediaProjection實現截圖與MediaMuxer實現錄屏MP4Gif格式

MediaProjection可以用來捕捉螢幕,具體來說可以擷取當前螢幕和錄製螢幕視訊 (5.0以上) 先總結下系統是如何實現組合鍵截圖的: 都應該知道Android原始碼中對按鍵的捕獲位於檔案PhoneWindowManager.java中 當滿足按鍵

佇列用連結串列實現建立插入新元素刪除元素讀取元素全部刪除全部讀出判斷是否清空)

下午把佇列的各種操作用連結串列實現了一下,建立,插入元素,刪除元素,讀取元素,全部刪除,全部讀出,判斷是否為空,清空,原始碼除錯已經通過,執行結果如下圖所示: #include "iostream" using namespace std; typedef struct

手把手教你基於SqlSugar4編寫一個視覺化程式碼生成器生成實體以SqlServer文末附原始碼)

  在開發過程中免不了建立實體類,欄位少的表可以手動編寫,但是欄位多還用手動建立的話不免有些浪費時間,假如一張表有100多個欄位,手寫有些不現實。 這時我們會藉助一些工具,如:動軟程式碼生成器、各種ORM框架自帶的程式碼生成器等等,都可以使用。 我們現在就基於SqlSugar(ORM框架)自己動手製造一個輪子

PHP+jQuery+Ajax單多)圖片

近日寫的一個銷售管理系統中,需要使用者上傳產品的圖片,找了好多外掛,用起來都挺麻煩的而且還不好改,最後找到一篇用php和ajax做圖片上傳的,感覺程式碼挺簡單的而且改起來很容易,轉發到此處與各位分享一下: 我們在本文中用到一個Ajax表單提交外掛:jqery.

springmvc圖片兼容ie8以上實時預覽)

處理 spa aps news time htm tip 技術分享 ans html代碼: <form id="uploadform" method="post" enctype="multipart/form-data"> <

ASP.NET Core 簡單實現七牛圖片FormData 和 Base64)

private stream public 圖片 ASP.NET Core 簡單實現七牛圖片上傳(FormData 和 Base64)七牛圖片上傳 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/1237/csharpUpoladServic

spring實現文件圖片解析)

handle exc 所有 sub str [] sys script ota 合抱之木,生於毫末,千裏之行,始於足下,要想了解spring的文件上傳功能,首先要知道spring是通過流的方式將文件進行解析,然後上傳。那麽是不是所有需要用的文件上傳的地方都要寫一遍文件解析器

HTML5+Canvas+jQuery調用手機拍照功能實現圖片二)

customer mkdir 狀態保存 ont false lan else if 項目 action 上一篇僅僅講到前臺操作,這篇專門涉及到Java後臺處理。前臺通過Ajax提交將Base64編碼過的圖片數據信息傳到Java後臺,然後Java這邊進行接收處理。通過

HTML5 file API加canvas實現圖片前端JS壓縮並 轉載)

www. 手機 回調 pre lan 瀏覽器中 rdp 效果 二進制 一、圖片上傳前端壓縮的現實意義 對於大尺寸圖片的上傳,在前端進行壓縮除了省流量外,最大的意義是極大的提高了用戶體驗。 這種體驗包括兩方面: 由於上傳圖片尺寸比較小,因此上傳速度會比較快,交互會更

公眾號調用微信圖片接口商品評論的圖片

微信 公眾號 圖片接口 <body> <div> <input type="button" value="頭像" onclick="chooseImage()"/> <div >

使用Ueditor圖片圖片服務器二)

java tpc linux 是我 jsp 使用 其他 div .cn 上一篇主要寫了前端部分如何配置ueditor的上傳路徑,已經jsp頁面中如何使用ueditor的編輯器功能以及如何配置單獨的圖片上傳功能。 這一篇,我分兩部分:第一部分是搭建圖片服務器以及配置ftp上傳

node.js實現圖片包含縮略圖)

http close path return new tde log img thumb 圖片上傳 使用multiparty插件實現上傳 安裝multiparty npm i --save multiparty 代碼實現 const multiparty = requi

接口自動化實現圖片selenium/RF)

herf ict 上傳圖片 帶圖片 amp 怎麽 top .get imp 最近做自動化碰到一個問題: 就是帶圖片上傳的不知道怎麽實現自動化:整理了下實現如下: 上傳圖片postman 結果請求如下,上傳圖片後返回一個圖片地址: post請求 body 是form-da