PHP dosyası indir Zorlama - Joomla çerçevesinde iç

0 Cevap php

Ben, bir veritabanı üzerinde bir sorgu çalıştırır, bir csv dosyasına sonuçlarını kaydeder ve daha sonra kullanıcı dosyayı indirmenize izin veriyor bazı PHP kodu var. Sorun csv dosyası gerçek csv içerik etrafında sayfa HTML ihtiva etmektedir.

I this one dahil olmak üzere burada zaten tüm ilgili soruları okudum. Ne yazık ki benim kod Joomla içinde var, bu yüzden başlıklarını ama hiçbir şey içeren bir sayfaya yönlendirmek için çalışsanız bile, Joomla otomatik olarak kendi navigasyon kodu ile onu çevreleyen. Bu yalnızca indirme anda olur; Ben sunucu üzerinde kurtardı csv dosyasına bakarsanız, bu HTML içermiyor.

Herkes oldukça tarayıcı olması için düzenleme gibi daha sunucuda olduğu gibi gerçek csv dosyasının indirme zorlamak için bir yol ile bana yardımcı olabilir misiniz? Ben bu gibi başlık konumunu kullanarak denedim:

header('Location: ' . $filename);

ama oldukça kaydetmek diyaloğu zorlamadan daha, tarayıcıda dosyayı açar.

İşte benim geçerli kod:

//set dynamic filename
$filename = "customers.csv";
//open file to write csv
$fp = fopen($filename, 'w');

//get all data
$query = "select 
   c.firstname,c.lastname,c.email as customer_email, 
   a.email as address_email,c.phone as customer_phone,
   a.phone as address_phone,
   a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
   from {$dbpre}customers c
   left  join  {$dbpre}customers_addresses a  on c.id = a.customer_id  order by c.last_signin desc";

$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
    //put header row
    if ($counter == 1){
       $headerRow = array();
       foreach ($row as $key => $val)
          $headerRow[] = $key;
       fputcsv($fp, $headerRow);
    }
    //put data row
    fputcsv($fp, $row);
    $counter++;
}

//close file
fclose($fp);

//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Transfer-Encoding: binary");
readfile($filename); 
exit;

EDITS Full URL looks like this:

http://mysite.com/administrator/index.php?option=com_eimcart&task=customers

Bu gibi bakarak gerçek indirme linki:

http://mysite.com/administrator/index.php?option=com_eimcart&task=customers&subtask=export

MORE EDITS Here's a shot of the page that the code is on; the generated file still is pulling in the html for the submenu. The code for the selected link (Export as CSV) is now

index.php?option=com_eimcart&task=customers&subtask=export&format=raw

alt text

Şimdi burada üretilen, kaydedilen dosyanın bir ekran görüntüsü:

alt text

Burada yükleme sırasında küçüldü, ancak metin subnav (liste müşteriler, yeni müşteri, csv gibi ihracat) eklemek için html kodu sarı vurgulanır. İşte benim tam kod artık şuna benziyor; Ben sadece html geçen bit kurtulmak eğer mükemmel olurdu.

  $fp= fopen("php://output", 'w');

            $query = "select c.firstname,c.lastname,c.email as customer_email, 
                      a.email as address_email,c.phone as customer_phone,
                      a.phone as address_phone,  a.company, a.address1,
                      a.address2,a.city,a.state,a.zip,c.last_signin

                      from {$dbpre}customers c
                      left  join  {$dbpre}customers_addresses a on c.id = a.customer_id  
                      order by c.last_signin desc";

            $votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
            $counter = 1;

            //redirect to file
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename=customers.csv");
             header("Content-Transfer-Encoding: binary");

            while ($row = mysql_fetch_array($votes,1)) {

                    //put header row
                    if ($counter == 1){
                            $headerRow = array();
                            foreach ($row as $key => $val)
                                    $headerRow[] = $key;

                            fputcsv($fp, $headerRow);
                    }

                    //put data row
                    fputcsv($fp, $row);
                $counter++;
            }

            //close file
            fclose($fp);

UPDATE FOR BJORN

İşte benim için çalıştı kodu (bence) bulunuyor. Eylem çağrıları bağlantı RAW param kullanın:

index.php?option=com_eimcart&task=customers&subtask=export&format=raw

Bu usul Çünkü, bizim bağlantı bu gibi görünüyor customers.php adlı bir dosyada, oldu:

switch ($r['subtask']){
    case 'add':
    case 'edit':
        //if the form is submitted then go to validation
                include("subnav.php");
        if ($r['custFormSubmitted'] == "true")
            include("validate.php");
        else
            include("showForm.php");
        break;

    case 'delete':
                include("subnav.php");
        include("process.php");
            break;

    case 'resetpass':
                include("subnav.php");
        include("resetpassword");
            break;

    case 'export':
        include("export_csv.php");
            break;


    default:
                include("subnav.php");
        include("list.php");
        break;
}

Bir kullanıcı yukarıdaki linke tıklandığında Yani, export_csv.php dosya otomatik olarak eklenir. Bu dosya tüm gerçek kodu içerir:

<?
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=customers.csv");
header("Content-Transfer-Encoding: binary");
$fp= fopen("php://output", 'w');


//get all data
$query = "select 
    c.firstname,c.lastname,c.email as customer_email, 
    a.email as address_email,c.phone as customer_phone,
    a.phone as address_phone,
    a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin

    from {$dbpre}customers c

    left  join  {$dbpre}customers_addresses a  on c.id = a.customer_id  order by c.last_signin desc";


$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;

while ($row = mysql_fetch_array($votes,1)) {

    //put header row
    if ($counter == 1){
        $headerRow = array();
        foreach ($row as $key => $val)
            $headerRow[] = $key;

        fputcsv($fp, $headerRow);
    }

    //put data row
    fputcsv($fp, $row);
    $counter++;
}

//close file
fclose($fp);

0 Cevap