Hướng dẫn download csv ajax php

I am generating a CSV string with PHP and send it via AJAX to my Javascript function.

A simple button

CSV

Call that function and should download a CSV file from the string. How can I handle that?

My PHP Function

function exportCSV[]{
$profs = $this->getAllDozent[];
$profs = json_decode[$profs, true];
$currentID = 0;
$csv = "IDDOZENT,IDVERANSTALTUNG,BEZEICHNUNG,SWS,CREDITS,HAEUFIGKEIT_PA,FAKTOR_DOPPELUNG,SOMMER,WPF,KOSTEN_PA,\n";

// Iteriere durch Professor Array
foreach[$profs as $key => $value]{
  $currentID = $value['IDDOZENT'];

  //Hole für ID die Veranstaltungen
  $veranstaltungen = $this->getVeranstaltungenByID[$currentID];
  $veranstaltungen = json_decode[$veranstaltungen, true];

  //Nur wenn Veranstaltungen da sind, abrufen.
  if[$veranstaltungen != "NULL"]{
    foreach [$veranstaltungen as $key => $value] {
    $csv = $csv.$currentID.","
    .$value['IDVERANSTALTUNG'].","
    .$value['BEZEICHNUNG'].","
    .$value['SWS'].","
    .$value['CREDITS'].","
    .$value['HAEUFIGKEIT_PA'].","
    .$value['FAKTOR_DOPPELUNG'].","
    .$value['SOMMER'].","
    .$value['WPF'].","
    .$value['KOSTEN_PA']."\n";
    }
  }
}

return $csv;

}

returns a valid csv string like that "a,b,c,d".

My Javascript looks like:

function csvExport[]{
    var xmlhttp = new XMLHttpRequest[];
    xmlhttp.onreadystatechange = function[] {
        if [this.readyState == 4 && this.status == 200]{ 
            console.log[this.responseText];
        }
    };
    xmlhttp.open["GET", "csvExport.php", true];
    xmlhttp.send[];
}

In the callback, I want to download the this.responseText as a CSV file. Is that possible?

CHỈNH SỬA Tôi vừa thử điều này với tệp 10MB và có vẻ như val [] quá chậm để chèn dữ liệu. Nhanh lên.

Được rồi, vì vậy tôi đã thử cái này cái khác. Điều này có thể có hoặc không hoàn toàn mất trí! Ý tưởng là thực hiện một yêu cầu AJAX để tạo dữ liệu, sau đó sử dụng lệnh gọi lại để chèn dữ liệu vào một biểu mẫu ẩn trên trang hiện tại có hành động của trang "tải xuống" thứ ba; sau khi chèn, biểu mẫu sẽ tự động được gửi, trang tải xuống sẽ gửi tiêu đề và gửi lại BÀI ĐĂNG, và sau đó, hãy tải xuống.

Trong khi đó, trên trang gốc, bạn có một dấu hiệu rằng tệp đang được chuẩn bị và khi nó hoàn thành, chỉ báo sẽ được cập nhật.

LƯU Ý: mã kiểm tra này không được kiểm tra rộng rãi và không có kiểm tra bảo mật thực sự [hoặc bất kỳ kiểm tra nào] được thực hiện. Tôi đã thử nghiệm nó với tệp CSV 1,5MB mà tôi đã đặt và nó khá linh hoạt.

Index.html

Click Me

test.js

$[document].ready[function[]{
  $["#downloadlink"].click[function[]{       // click the link to download
      lock[];                                // start indicator
      $.get["create.php",function[filedata]{ // AJAX call returns with CSV file data
          $["#filedata"].val[filedata];      // insert into the hidden form
          unlock[];                          // update indicator
          $["#hiddenform"].submit[];         // submit the form data to the download page
      }];
  }];

  function lock[]{
      $["#wait"].text["Creating File..."];
  }

  function unlock[]{
      $["#wait"].text["Done"];
  }
}];

create.php


download.php


5 hữu ích 0 bình luận chia sẻ

Cài đặt

Việc đầu tiên là bạn phải đi cài đặt cho mình một project laravel. Các bước cơ bản này mình sẽ không nhắc lại nữa nhé. Nếu bạn vẫn thấy bỡ ngỡ thì có thể lên trang chủ của laravel để tìm cách cài đặt nhé, mới nhất đang là bản 7. rồi: //laravel.com/docs/7.x/installation

Để xuất file csv hoặc excel trong laravel sẽ dùng đến một thư viện đó là maatwebsite/excel
Sử dụng câu lệnh sau để cài đặt:

composer require maatwebsite/excel

Mặc định Maatwebsite\Excel\ExcelServiceProvider sẽ được tự động đăng ký theo mặc định. Tương tự với Excel facade Maatwebsite\Excel\Facades\Excel .

Publish config

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider

Và bây giờ nếu bạn muốn thay đổi config của thư viện này thì nó nằm trong file config/excel.php.

Xây dựng xuất file với laravel

Mình sẽ đặt ra một bài toán cơ bản là xuất thông tin của các sản phẩm [product] ra thành file csv/ excel. Sản phẩm sẽ gồm tên sản phẩm, số lượng sản phẩm, như vậy thôi cho nhanh nhé. Giờ cùng bắt tay đi thực hiện nào.

Tạo migration và model

Mình cần tạo migration và model product để xuất dữ liệu.

php artisan make:model Product -m

câu lệnh này sẽ đồng thời tạo một model class là Product và một file migration [timestamp].create_products_table.php trong thư mục database/migrations.

Thêm một vài thông tin cho migration của chúng ta

public function up[]
{
    Schema::create['products', function [Blueprint $table] {
        $table->bigIncrements['id'];
        $table->string['name'];
        $table->integer['quantity'];
        $table->timestamps[];
    }];
}

Chạy migrate với câu lệnh

php artisan migrate

Bây giờ mình sẽ giả sử là trong bảng products đã có dữ liệu rồi, chúng ra sẽ đi xuất dữ liệu từ bảng products này

Controller và route

Tạo file ProductController.php trong thư mục Controller, đây sẽ là nơi thực hiện các bước export file trả về cho người dùng.

php artisan make:controller ProductController

Nhớ rằng tạo route đễ điều hướng dẫn đến controller vừa tạo nhé

Route::get['products', 'ProductController@index']->name['product.index'];
Route::post['products/exportFile', 'ProductController@exportFile']->name['product.export-file'];

Quay trở lại với controller. Tạo hai method indexexportFile trong ProductController

Chủ Đề