使用ajax異步提交表單


雖然這篇文章的標題是提交表單,但是主要的難點在於使用ajax提交文本域的內容,

在工作中的經常會需要ajax跨域的問題,通常的需求使用jsonp就可以得到解決,但是當前項目中有一個圖片服務器,客戶端需要直接上傳圖片到圖片服務器中,這就產生了一個跨域post提交文件的問題,很顯然jquery本身jsonp只支持get方式的異步提交肯定是不行

其中也嘗試過使用ifrmae的方法來提交數據,在網上有,但是效果不理想,並且也很復雜的樣子,最后選擇出了jquery.from.js 這個插件,可以實現異步的表單提交,

先是客戶端代碼的html文件

主要加載兩個文件 juery 和 jquery.from.js

代碼如下

 1 <script src="jquery.js"></script>
 2 <script src="jquery.form.js"></script>
 3 <form id="myform" method="post" action="http://images.byshop.com/wechat/imgFormUpload" enctype="multipart/form-data">
 4     <input type="file" name="userfile[]"  multiple id="img_file">
 5     <input type="submit" value="shangchuan">
 6 </form>
 7 <input type="button" value="ajax_submit" onclick="imgFormUpload()">
 8 <script>
 9     function imgFormUpload() {
10         $("#myform").ajaxSubmit({
11             dataType: 'json',
12             success: function (data) {
13                 alert("submit success");
14             }
15         });
16     }
17 </script>

服務端php代碼

<?php
header("Access-Control-Allow-Origin: *");
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 微信方法控制器
 * 
 * @author azhw
 * @create_tiem 2015-07-17
 * @edit_time 2015-07-20
 * @editer azhw
 */
class Wechat extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->helper(array('dir', 'url'));
    }
    
    public function imgFormUpload(){
        $re_arr = array();
        if(isset($_FILES['userfile']['tmp_name']) && isset($_POST['path']) && isset($_POST['filename'])){
            $tmp_name = $_FILES['userfile']['tmp_name'];var_dump($tmp_name);
            $filename = $_POST['filename'];
            $filename_arr = explode(',', $filename);
            $path = $_POST['path'];
            if(count($tmp_name) === count($filename_arr)){
                mkdirs(FCPATH.$path);//這是如果不存在就遞歸創建目錄的函數
                for($i = 0; $i < count($tmp_name); $i++){
                    move_uploaded_file($tmp_name[$i], FCPATH.$path.$filename_arr[$i]);
                }
                $re_arr['code'] = 1;
                $re_arr['response'] = 'success';
            }
            else{
                $re_arr['code'] = 100101;
                $re_arr['response'] = '文件數量和文件名稱數量不統一';
            }
        }
        else{
            $re_arr['code'] = 100100;
            $re_arr['response'] = '丟失關鍵參數';
        }
//        $re_arr['code'] = 100101;
//        $re_arr['response'] = '文件數量和文件名稱數量不統一';
        echo json_encode($re_arr);
    }  
}

這段代碼中需要注意的是header("Access-Control-Allow-Origin: *");   異步ajax需要這個頭信息

if(isset($_FILES['userfile']['tmp_name']) && isset($_POST['path']) && isset($_POST['filename'])){...}  這里判斷的稍微有點多,我的path 和filename都是從客戶端傳遞來的參數
move_uploaded_file($tmp_name[$i], FCPATH.$path.$filename_arr[$i]); 關於for內部的東西可以用自己框架或者自己的類來實現上傳的功能,這里只是一個示例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM