2016-04-11 30 views
0

Sunucuda bir yere dosya kaydetmeden CSV dosyalarını doğrudan tarayıcımdan indirmeye çalışırken sorun yaşıyorum. Bir öğretici buldum (https://www.perpetual-beta.org/weblog/php-stream-file-direct.html) ama çalışmayı başaramıyorum!PHP - CSV Dosyalarını Tarayıcıya Aktarma

Bu benim ana işlevidir:

public function exportRecord($id) { 
    $contest = (string) $this->getContest($id); 
    $entries = (array) $this->getEntries($id); 

    $filename = sprintf('%1$s-%2$s-%3$s', str_replace(' ', '', $contest['name']), date('Ymd'), date('His')); 
    $output = fopen('php://output', 'w'); 

    ob_start(); 

    $header = array(
     'First Name', 
     'Last Name', 
     'Address', 
     'City', 
     'State', 
     'Zip', 
     'Phone', 
     'Email', 
     'Item Purchased', 
     'Partner Name', 
     'Partner #', 
     'Date Entered', 
     'Subscribe' 
    ); 

    fputcsv($output, $header); 

    foreach ($entries as $entry) { 
     fputcsv($output, $entry); 
    } 

    $string = ob_get_clean(); 

    header('Pragma: public'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Cache-Control: private', false); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="' . $filename . '.csv";'); 
    header('Content-Transfer-Encoding: binary'); 

    exit($string); 
} 

Sadece benim veritabanı sorguları yapmak aşağıdaki iki işlevleri çağırıyorum ... Ben herhangi bir yardım/tavsiye takdir

private function getContest($id) { 
    $query = sprintf(
     'SELECT name ' . 
     'FROM contests ' . 
     'WHERE id = %s;', 
     $id 
    ); 

    $result = $this->mysql->query($query); 
    $response = ''; 

    if ($result) { 
     while ($row = mysqli_fetch_assoc($result)) { 
      $response = $row; 
     } 
    } else { 
     echo $this->mysql->error; 
    } 

    return $response; 
} 

private function getEntries($id) { 
    $query = sprintf(
     'SELECT firstName, ' . 
      'lastName, ' . 
      'CONCAT(address1, ", ", address2), ' . 
      'city, ' . 
      'state, ' . 
      'zip, ' . 
      'phone, ' . 
      'email, ' . 
      'itemPurchased, ' . 
      'partnerName, ' . 
      'partnerNum, ' . 
      'dateEntered, ' . 
      'subscribe ' . 
     'FROM entries ' . 
     'WHERE contestID = %s;', 
     $id 
    ); 

    $result = $this->mysql->query($query); 
    $response = ''; 

    if ($result) { 
     while ($row = mysqli_fetch_assoc($result)) { 
      $response[] = $row; 
     } 
    } else { 
     echo $this->mysql->error; 
    } 

    return $response; 
} 

size Vereceğim! İşte bir ekran görüntüsü, sadece sorunun ne olduğuna dair bir fikir vermek için: Screenshot Teşekkür ederiz!

+0

Tam olarak ne tür bir tarayıcı kullanıyorsunuz? Son zamanlarda bu yöntemle Safari ile ilgili sorunlar buldum. – NoobishPro

+0

Bundan bahsetmeliydim! Afedersiniz. En yeni Chrome ve Firefox sürümlerini kullanıyorum. Ayrıca IE9'da denedim. – brandoncluff

+0

Tamam, 2 soru daha. 1) 'error_reporting'i (E_ALL) denediniz; ini_set ('display_errors', '1'); 'herhangi bir hata olup olmadığını kontrol etmek için? (bunu en tepeye yerleştiriniz) - 2) * Herhangi bir * sonuç alır mısınız? $ String bir şey gösteriyor mu? Tam olarak ne çalışmıyor? – NoobishPro

cevap

1

Ben JS ile bunu sona erdi.

    } else if (action == 'export') { 
        if (result.data !== false) { 
         var data = encodeURIComponent(result.data); 
         var contest = result.contest.trim(); 
         var filename = contest + '.csv'; 
         var dataUri = 'data:text/csv;charset=utf-8,' + data; 
         var link = document.createElement('a'); 

         link.setAttribute('href', dataUri); 
         link.setAttribute('download', filename); 
         document.body.appendChild(link); 
         link.click(); 

         showMessage('Export successfully created!', 'success'); 
        } else { 
         showMessage('There are no entries for this contest! Nothing to export...', 'error'); 
        } 
       } 
0

Örnekte Jonathan Hollin'in birkaç adımını kaçırıyorsunuz. Çıktı tamponlamasını başlatmanız gerekiyor, arabelleği yazmanız ve üstbilgileri doğru bir şekilde ayarlamanız gerekiyor. Bu, bazı değişiklik yapmak gerekebilir ama bu soruya verilen ne örnek adapte etmeye çalıştı:

<?php 
public function exportRecord($id) { 
    $contest = (array) $this->getContest($id); 
    $entries = (array) $this->getEntries($id); 

    $filename = sprintf('%1$s-%2$s-%3$s', str_replace(' ', '', $contest['name']), date('Ymd'), date('His')); 

    $header = array(
     'First Name', 
     'Last Name', 
     'Address', 
     'City', 
     'State', 
     'Zip', 
     'Phone', 
     'Email', 
     'Item Purchased', 
     'Partner Name', 
     'Partner #', 
     'Date Entered', 
     'Subscribe' 
    ); 

    export_csv($header, $entries, $filename); 
} 

private function export_csv($header, $data, $filename) { 
    // No point in creating the export file on the file-system. We'll stream 
    // it straight to the browser. Much nicer. 

    // Open the output stream 
    $fh = fopen('php://output', 'w'); 

    // Start output buffering (to capture stream contents) 
    ob_start(); 

    // CSV Header 
    if(is_array($header)){ 
     fputcsv($fh, $header); 
    } 

    // CSV Data 
    foreach ($data as $row) { 
     fputcsv($fh, $row); 
    } 

    // Get the contents of the output buffer 
    $string = ob_get_clean(); 

    // Output CSV-specific headers 
    header('Pragma: public'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Cache-Control: private', false); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="' . $filename . '.csv";'); 
    header('Content-Transfer-Encoding: binary'); 

    // Stream the CSV data 
    exit($string); 
} 
+0

Tavsiye için teşekkürler! Kodumu güncelledim ve Chrome ve Firefox'ta denedim. Hala çalışmıyor. Sayfayı İncelediğimde Ağ sekmemde çıkışım ($ string) var. Bir resim yükledim. – brandoncluff

+0

Tüm başlıkların ayarlandığından emin olun (Özellikle İçeriği-Yerleştirme ve İçerik Türü). Bunu tekrar test ettim ve her şey şeylerin csv çıkış akışı tarafında iyi görünüyor. Bir diziye bir dizge döktüğünüze benzer ve bu sorunun kapsamı dışındadır. Sorunu daha açık bir şekilde göstermek için azaltılmış bir örnek oluşturmanızı öneriyorum. [Link] https://css-tricks.com/reduced-test-cases/ – gmreburn