2014-09-02 75 views
-2

我是一個帶AJAX的新手,我問是否可以從「文件輸入」中讀取CSV文件,並從中提取數據並顯示數據沒有掩飾形式的同一頁面。 這裏是我的代碼:Ajax - PHP:從CSV文件中提取數據而不提交

的index.html:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Choose a CSV File</title> 
</head> 
<body> 
    <h1>Choose a CSV file :</h1> 
    <form method="post" action="csv_to_array.php" enctype="multipart/form-data"> 
     <div> 
      <input type="file" name="file" required/> 
      <input type="submit" value="Upload CSV Data" /> 
     </div> 
    </form> 
    <div> 
    <!-- diplaying the data extracted from the csv file --> 
    </div> 
</body> 
</html> 

csv_to_array.php:

<?php 

if ($_FILES["file"]["error"] > 0) { 
    echo "Error: " . $_FILES["file"]["error"] . "<br>"; 
} else { 

    echo "Upload: " . $_FILES["file"]["name"] . "<br>"; 
    echo "Type: " . $_FILES["file"]["type"] . "<br>"; 
    echo "Size: " . ($_FILES["file"]["size"]/1024) . " kB<br>"; 
    echo "Stored in: " . $_FILES["file"]["tmp_name"]. "<br>"; 

    $users = array(); 

    $labels = array('id', 'name', 'age'); 

    $fh = fopen ($_FILES["file"]["tmp_name"], 'r'); 
    fgetcsv($fh); 

    if ($fh) { 
     while (!feof($fh)) { 
      $row = fgetcsv($fh, 500, ';'); 
      $tempRow = array(); 
      if (isset($row) && is_array($row) && count($row)>0) { 
       foreach ($row as $key => $value) { 
        $tempRow[$labels[$key ]] = $value; 
       } 
       $users[] = $tempRow; 
      } 
     } 
     fclose($fh); 
     $numLines = count($users); 
    } 

    // I want this to be displayed in index.html : 
    echo $numLines; 
    echo '<table style="border: 1px solid black;">'; 
    echo '<tr>'; 
    echo '<td>ID</td>'; 
    echo '<td>NAME</td>'; 
    echo '<td>AGE</td>'; 
    echo '</tr>'; 
    for ($x=0; $x<$numLines; $x++) { 
     echo '<tr>'; 
     echo '<td>'.$users[$x]['id'].'</td>'; 
     echo '<td>'.$users[$x]['name'].'</td>'; 
     echo '<td>'.$users[$x]['age'].'</td>'; 
     echo '</tr>'; 
    } 
    echo '</table>'; 

} 

?> 

預先感謝您的傢伙!

+0

參見:http://stackoverflow.com/a/8244082/1981678 – briansol 2014-09-02 18:10:32

回答

0

有很多不同的方法來做到這一點。 我的建議是使用一個插件作爲Blueimp jQuery的文件上傳:https://github.com/blueimp/jQuery-File-Upload

爲什麼它更好地使用已經存在的插件:

  1. 安全性(我們這裏談論上傳文件,有一些安全問題,你必須考慮)
  2. 文件大小,格式等/上傳時間
  3. 上傳進度(進度條等)。你可以做什麼
  4. 社區/支持

例子:

1 - 上傳的文件(CSV只,10 MB最大...)

$('#importData').fileupload({ 
      dataType: 'json', 
      autoUpload: true, 
      acceptFileTypes: /(\.|\/)(csv)$/i, 
      maxFileSize: 10000000 // 10 MB 
      [...] 
    }).on('fileuploadprogressall', function (e, data) { 
      // You can manage your progress here 
    }).on('fileuploaddone', function (e, data) { 
      // You can now call your ajax file that will take care of the CSV (csv_to_array.php) 
      (*) 
    }); 

2 - 一旦上傳完成 (用上面代碼中的'*'表示)

$.ajax({ url: './ajax/csv_to_array.php', 
      data: {file_path:file.name, delete_url: file.deleteUrl}, 
      type: 'post', 
      dataType: "json", 
      beforeSend: function(xhr){xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");}, 
      success: function(dataCSVFile) { 
          // Here in Jquery for example you can display your data 
      }); 

3 - 在您的CSV PHP過程中要小心,我建議您添加很多不同的檢查,以確保用戶將放置的文件的格式。 (特別是如果您打算將數據保存在數據庫中)。

問候,

+0

謝謝@ maxime_039 – bboulahdid 2014-09-02 18:42:38