1. 程式人生 > >ajaxFileUpload 非同步上傳檔案配合PHP的使用

ajaxFileUpload 非同步上傳檔案配合PHP的使用

本人最近在學習PHP,並在用PHP寫一個簡單的個人部落格網站的時候需要對個人的頭像進行非同步上傳,經過研究,成功實現了ajaxFileUpload+PHP的非同步上傳功能,所以抽空做下總結,本文主要講解ajaxFileUpload 非同步上傳檔案配合PHP使用

jQuery外掛ajaxFileUpload可以實現ajax檔案上傳,使用非常簡單。

準備環境

jquery.js
ajaxfileupload.js
這裡寫圖片描述
注意:jquery-1.4.2之後的版本和ajaxfileupload.js 報錯:jQuery.handleError is not a function,詳細解決方法可以參考我上一篇的博文:

ajaxFileUpload :jQuery.handleError is not a function的解決方法

ajaxfileupload原理

原理:ajaxfileupload是通過監聽iframe的onload方法來實現, 當從服務端處理完成後,就觸發iframe的onload事件呼叫其繫結的方法,在繫結的方法中獲取iframe中伺服器返回的資料體(支援的普通文字,json,xml,script, html)

語法:$.ajaxFileUpload([options])

引數說明:

1,url 上傳處理程式地址,也就是我傳送給伺服器端所要處理上傳的地址。

2,fileElementId 需要上傳的檔案域的ID,即的ID。

3,secureuri 是否啟用安全提交,預設為false。

4,dataType 伺服器返回的資料型別。可以為xml,script,json,html。如果不填寫,jQuery會自動判斷。

5,success 提交成功後自動執行的處理函式,引數data就是伺服器返回的資料。

6,error 提交失敗自動執行的處理函式。

7,data 自定義引數。這個很有用,比如你上傳圖片的同時想把圖片名也一起傳過去,可以用這個引數去實現。

8,type 當要提交自定義引數時,這個引數要設定成post

接下來我們看看如何去使用

靜態頁面的程式碼

<div class="form-group"
> <label for="firstname" class="col-sm-1 control-label">頭像</label> <div class="col-sm-2"> <label for="inputfile"></label> <input type="hidden" id="headImg"/> <input type="file" id="headImgUpload" name="headImgUpload"/><br/> <label class="control-label" for="headImgUpload" style="display: none;"></label> <p class="help-block"><img class="img-rounded" src="#" width="100" height="100" id="img1" alt="請上傳頭像" /></p> </div> </div>

這裡寫圖片描述
顯示結果如下:
這裡寫圖片描述

引入js程式碼

這裡寫圖片描述
ajaxHeardImgUpload.js檔案如下

$(document).ready(function(){
    //解決file的change事件只能執行一次的問題
    $(document).on('change','#headImgUpload',function(){
        ajaxHeadImgUpload();

    });
});


//上傳頭像圖片的方法,
function ajaxHeadImgUpload(){
    //呼叫ajaxfileupload.js中的方法
    $.ajaxFileUpload({
        url:'/MyBlog/index.php?p=back&c=Uploader&a=uploaderHead',//上傳圖片要提交到的PHP後臺Action方法
        secureuri:false,//是否用安全提交,預設為false
        fileElementId:'headImgUpload',//file選擇檔案的框的id
        dataType:'json',//資料返回格式,如果用json,需要修改ajaxfileupload.js中的內容 eval("data = " + data ); -->data = jQuery.parseJSON(jQuery(data).text());
        success: function (data){
            if(data.success){
                //獲得json格式資料的值,並轉換顯示圖片在頁面上
                 $("#img1").attr("src",data.path);
                 $("#headImg").val(data.path);

            }
            showInfo(data.info);
        },
        error: function(data, status, e){   //提交失敗自動執行的處理函式
            alert(e);
        }
    });
}


function showInfo(msg) {
    $("#div_info").text(msg);
    $("#modal_info").modal('show');
}

這裡寫圖片描述

PHP中的處理上傳的程式碼

<?php
/**
 * Created by PhpStorm.
 * User: c
 * Date: 2017/4/17
 * Time: 9:03
 */

class UploaderController extends BaseController {


    //上傳頭像方法
    public function uploaderHeadAction(){
        $fileName = "headImgUpload";
        $this->uploader($fileName);

    }

    //上傳微信二維碼方法
    public function uploaderWeChatAction(){
        $fileName = "wechatImgUpload";
        $this->uploader($fileName);

    }




    public function uploader($fileName) {
        $files = array();
        $files['name'] = $_FILES[$fileName]['name'];   //上傳圖片的原名字
        $files['info'] = ""; //和該檔案上傳相關的資訊
        $files['size'] = $_FILES[$fileName]['size'];   //已上傳檔案的大小,單位為位元組
        $files['type'] = $_FILES[$fileName]['type'];   //檔案的 MIME 型別,需要瀏覽器提供該資訊的支援,例如"image/gif"
        $files['success'] = false;            //這個用於標誌該圖片是否上傳成功
        $files['path'] = '';                //存圖片路徑

        //:0:表示沒有發生錯誤
        if($_FILES[$fileName]['error']==0){
            //is_uploaded_file — 判斷檔案是否是通過 HTTP POST 上傳的
            if(is_uploaded_file($_FILES[$fileName]['tmp_name'])) {
                    //副檔名
                 $extension = '';
                 //strcmp — 二進位制安全字串比較 (區分大小寫)
               // 如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0。
                 if(strcmp($_FILES[$fileName]['type'], 'image/jpeg') == 0) {
                     $extension = '.jpg';
                  }else if(strcmp($_FILES[$fileName]['type'], 'image/png') == 0) {
                     $extension = '.png';
                  }else if(strcmp($_FILES[$fileName]['type'], 'image/gif') == 0) {
                     $extension = '.gif';
                 }else{
                     //如果type不是以上三者,我們就從圖片原名稱裡面去擷取判斷去取得(處於嚴謹性)
                     //strrchr — 查詢指定字元在字串中的最後一次出現
                     $substr = strrchr($_FILES[$fileName]['name'], '.');
                     if(FALSE != $substr) {
                         $files['info'] = "檔案型別有誤";
                     }
                      //strcasecmp — 二進位制安全比較字串(不區分大小寫),比較字串是否相同
                     //如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0。
                     //取得原名字的副檔名後,再通過副檔名去給type賦上對應的值
                     if(strcasecmp($substr, '.jpg') == 0 || strcasecmp($substr, '.jpeg') == 0 || strcasecmp($substr, '.jfif') == 0 || strcasecmp($substr, '.jpe') == 0 ) {
                         $files['type'] = 'image/jpeg';
                     }else if(strcasecmp($substr, '.png') == 0) {
                         $files['type'] = 'image/png';
                     } else if(strcasecmp($substr, '.gif') == 0) {
                         $files['type'] = 'image/gif';
                     }else {
                         $files['info'] = "上傳的檔案型別不符合";
                     }
                     $extension = $substr;//賦值副檔名

                 }

                 if(trim($files['info'])==""){
                    //對臨時檔名加密,用於後面生成複雜的新檔名
                    $md5 = md5_file($_FILES[$fileName]['tmp_name']);
                    //取得圖片的大小
                    //getimagesize() 函式將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM
                    // 或 WBMP 影象檔案的大小並返回影象的尺寸以及檔案型別
                    //和一個可以用於普通 HTML 檔案中 IMG 標記中的 height/width 文字字串。
                    $imageInfo = getimagesize($_FILES[$fileName]['tmp_name']);
                    $rawImageWidth = $imageInfo[0];
                    $rawImageHeight = $imageInfo[1];
                    //設定圖片上傳路徑,放在upload資料夾,以年月日生成資料夾分類儲存,

                    $path = ROOT . 'upload\\' . @date("Ymd"). '\\';
                    ///確保目錄可寫
                    if($this->ensure_writable_dir($path)){
                        ////檔名
                        $name = "$md5.0x{$rawImageWidth}x{$rawImageHeight}{$extension}";
                        //加入圖片檔案沒變化到,也就是存在,就不必重複上傳了,不存在則上傳
                        $ret = file_exists($path . $name) ? true : move_uploaded_file($_FILES[$fileName]['tmp_name'], $path . $name);
                        if ($ret === false) {
                            $files['info'] = "上傳失敗";
                        } else {
                            $files['path'] = "\\MyBlog\\upload\\" . @date("Ymd"). '\\'. $name;        //存圖片路徑
                            $files['success'] = true;            //圖片上傳成功標誌
                            $files['width'] = $rawImageWidth;    //圖片寬度
                            $files['height'] = $rawImageHeight;    //圖片高度
                            $files['info'] = "上傳成功";//寫入成功
                        }
                    }else{
                        $files['info'] = "目錄不可寫";//目錄不可寫
                    }
                 }

            }else{
                $files['info'] = "上傳失敗";//上傳失敗
            }

        }


        echo json_encode(array(
            'success' =>  $files['success'],
            'path' => $files['path'],
            'info'=>$files['info'],
         ));
    }


    /**
     * 判斷是否可寫
     * @param $dir
     * @return bool
     */
    function ensure_writable_dir($dir) {
        if(!file_exists($dir)) {
            mkdir($dir, 0766, true);
            chmod($dir, 0766);
            chmod($dir, 0777);
        }
        else if(!is_writable($dir)) {
            chmod($dir, 0766);
            chmod($dir, 0777);
            if(!is_writable($dir)) {
               return false;
            }
        }
        return true;
    }


}

這裡寫圖片描述

最後就可以看到上傳結果了:
這裡寫圖片描述

本例子的上傳處理還對上傳檔案的型別進行限制,本例子限制只能上傳圖片,如果上傳的型別不符合,會出現提示:

這裡寫圖片描述

程式碼基本上都加上了註釋,方便大家理解,雖然這裡使用PHP做檔案上傳處理,但具體的上傳思路都是相同的。如果你想看ajaxFileUpload +Struts2的簡單使用,可以檢視我的博文:ajaxFileUpload 非同步上傳檔案配合Struts2的簡單使用

相關推薦

ajaxFileUpload 非同步檔案配合PHP的使用

本人最近在學習PHP,並在用PHP寫一個簡單的個人部落格網站的時候需要對個人的頭像進行非同步上傳,經過研究,成功實現了ajaxFileUpload+PHP的非同步上傳功能,所以抽空做下總結,本文主要講解ajaxFileUpload 非同步上傳檔案配合PHP使用

php + ajax非同步檔案 阿星小棧

html程式碼 <head> <script src="/libs/jQuery/jquery-2.2.4.min.js"></script> <script> var url = "

SpringMVC中使用ajaxfileupload非同步圖片檔案視訊

摘要:一、在專案中匯入commons-fileupload-1.3.1.jarcommons-io-2.4.jar 兩個jar包,引入專案中。、二、並在Spring-mvc.xml中配置multipart的上傳解析器,這裡上傳的都是通過multipart這個類<!--

ajaxfileupload.js非同步檔案外掛(完整demo)

ajaxfileupload.js非同步上傳檔案外掛 HTML: <input type="file" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" name="ph

ajaxFileUpload 非同步圖片 使用說明

首先引入 相應的jquery <script src="script/jquery-1.7.1.min.js"></script> <script src="script/ajaxfileupload.js"></script>

ajax非同步檔案以及匯入excle檔案到資料庫

html程式碼: <div class="sc_btn_box"> <input type="file" class="sc_btn" id="file"> <span class="file_uploader">選擇</span>

非同步檔案時獲取進度資訊

轉自:https://javaweb.io/post/63 XMLHttpRequest例項的upload屬性可以新增一個事件progress,通過該事件回撥可以獲取到上傳進度資訊 原生上傳 //獲取檔案筐的檔案集合 let files = document.getElem

JavaEE拾遺01--非同步檔案

今天學習了JavaEE的Servlet的非同步呼叫和檔案上傳,合著做了一個非同步上傳檔案練習,注意到Servlet是多執行緒的,所以實際操作中不需要非同步操作(我是這麼覺得的),閒話少說,看程式碼 <%@ page language="java" contentType="text

ajax實現非同步檔案

 html+js程式碼 <form action="" enctype="multipart/form-data" id="upForm"> {{csrf_field()}} <input type="text" name="name" value="

非同步檔案(formDate)

var oMyForm = new FormData(); oMyForm.append("username", "Groucho"); oMyForm.append("accountnum", 123456); oMyForm.append("file", $('#file')[0].fil

Jquery不使用form表單非同步檔案的方法

    現在的專案中需要使用到不重新整理頁面的方式實現上傳檔案,實現方法如下: html程式碼:   檔案:<input id="file" type="file" name="file"/> <butt

webuploader多圖,webuploader多檔案,百度webuploader批量非同步檔案

有人學習過子恆老師webuploader使用指南後, 留言說“webuploader多檔案上傳怎麼實現?webuploader怎麼上傳多圖片” 其實這些人都是沒有看完整個教程的原因, 下面來談談…

使用Ajax非同步檔案

html: <form id="formid" action="" method="post" enctype="multipart/form-data"> 檔案:<input type="file" name="fileName"

ajax非同步檔案完成後執行其他操作

var fileCount=檔案個數;//計數器 $.ajax({             //寫死測試             url: baseUrl + "/dfs/upload/plugins/fileproxy/fileproxy?type=upload&

spring 非同步檔案給第三方

import java.util.concurrent.Future; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.schedu

微信小程式wx.uploadFile(檔案PHP伺服器獲取formData的資料

例如下面的程式碼是微信小程式上傳圖片的程式碼: wx.chooseImage({ success: function(res) { var tempFilePaths = res.tempFilePaths wx.uploadFile({

HTML5 拖拽以及實現拖拽非同步檔案

HTML5拖拽 一、傳統實現拖拽的方式 傳統的就是使用js實現元素的拖拽,核心原理如下: #box{ width:100px; height:100px; background:red; /*實現拖拽的核心之一!拖拽實質就是不斷改變其定位,所以需要先設定為絕對定位 然後結

AJAXUpload JavaWeb 非同步檔案

之前的專案用到了非同步上傳,於是在網上開始尋找相關資料,最開始找到了AJAXFileUpload .js。 但是AJAXFileUpload .js最大的問題是需要對應版本的jquery,但是我專案下的jquery 還是很早的jquery1.3.1.於是乎不能用了。然後我開始找其最新版本,發

HTML5 jQuery+FormData 非同步檔案,帶進度條

利用jQuery和html5的FormData非同步上傳檔案的好處是: 實現很簡單很方便地支援進度條很方便地進行擴充套件和美化 先看看效果圖: 圖片上傳後的結果: 實現步驟如下: 第二步:上傳頁面的html程式碼: [html] view plain

jquery的非同步提交表單(非同步檔案)及jquery.form.js檔案注意事項

方法一:jquery的ajax方式,通過FormaData獲取表單資料 (1)這種方式只需要jquery-1.7.js外掛; (2)通過`jquery中的FormaData類: 自動搜尋表單資訊(表單內沒有name屬性的input不會被搜尋到),IE<=9