+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Downloadfunktion im Controller

  1. #1
    Neu an Board
    Registriert seit
    01.06.2005
    Ort
    Dortmund
    Alter
    42
    Beiträge
    26
    Bedankte sich
    3
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard Downloadfunktion im Controller

    Hallo zusammen,

    ich habe ein Problem mit meinem Controller.
    Wenn ich den Link drücke, dass ich die Datei runter laden will
    geht es auch. Jedoch bekomme ich keine au3-Datei sondern eine htm-Datei.

    Hier mal mein Script:
    PHP-Code:
    /**
            * function download
            */
           
    function download()
            {
            
    $db =& JFactory::getDBO();
            
    $id     $_GET[id];
            
    $query ='SELECT n.*, v.name AS author, u.name AS editor FROM #__autoitbase AS n'
                  
    ' LEFT JOIN #__users AS v ON v.id = n.created_by '
                  
    ' LEFT JOIN #__users AS u ON u.id = n.modified_by '
                  
    ' WHERE n.id = '.$id.''
                  
    ' AND n.published = 1 LIMIT 1';
            
    $db->setQuery$query );
            
    $row      $db->loadObject();
            
    $dateau3  JHTML::_('date',  $row->createdJText::_('DATE_FORMAT_LC4') );
            
    $output   sprintf JText::_'SEND_DOWNLOAD_AU3' ), $row->author$row->name$dateau3$row->script);
            
    $name str_replace(' ''_'$row->name);
            
    $filename $name.'.au3';
            
    // Send au3 file headers
            
    header('Content-Type: application/octet-stream');
            
    header('Content-Disposition: attachment; filename='.$filename);
            
    header('Content-Length: '.strlen($output));
            
    header('Pragma: no-cache');
            
    header('Expires: 0');

            print 
    $output;
            } 
    Ich hoffe, dass mir hier einer von euch helfen kann.

    Grüße

    Olly
    Geändert von OllyP234 (16.09.2010 um 13:03 Uhr)

  2. #2
    Hat hier eine Zweitwohnung Avatar von JoomDesign
    Registriert seit
    19.03.2006
    Ort
    Berlin, Deutschland
    Beiträge
    1.927
    Bedankte sich
    269
    Erhielt 594 Danksagungen
    in 511 Beiträgen

    Standard

    Ich habe auch mal versucht header()-Angaben in Joomla hinzufügen.
    Ging leider nicht! Zumindest nicht in Views.

    Dann musste ich lesen, dass z.B.: der Content-Type nur mit
    $document = &JFactory::getDocument();
    $document->setMimeEncoding('image/jpeg');
    geändert werden kann.

    Wie Du jetzt allerdings die Content-Length etc. hinzufügst weiß ich leider nicht so genau. Vielleicht hilft Dir die Dokumentation zur JDocument-Klasse weiter.

    //edit: hier ganz unten findest Du was zur "Content-Disposition" und Joomla
    Geändert von JoomDesign (16.09.2010 um 09:37 Uhr) Grund: link ergänzt

  3. #3
    Verbringt hier viel Zeit
    Registriert seit
    24.01.2006
    Beiträge
    594
    Bedankte sich
    108
    Erhielt 359 Danksagungen
    in 203 Beiträgen

    Standard

    PHP-Code:
    /**
            * function download
            */
           
    function download()
            {
            
    $db =& JFactory::getDBO();
            
    $id     $_GET[id]; // böse
            
    $query ='SELECT n.*, v.name AS author, u.name AS editor FROM #__autoitbase AS n'
                  
    ' LEFT JOIN #__users AS v ON v.id = n.created_by '
                  
    ' LEFT JOIN #__users AS u ON u.id = n.modified_by '
                  
    ' WHERE n.id = '.$id.'' // noch böser
                  
    ' AND n.published = 1 LIMIT 1';
            
    $db->setQuery$query );
            
    $row      $db->loadObject();
            
    $dateau3  JHTML::_('date',  $row->createdJText::_('DATE_FORMAT_LC4') );
            
    $output   sprintf JText::_'SEND_DOWNLOAD_AU3' ), $row->author$row->name$dateau3$row->script);
            
    $name str_replace(' ''_'$row->name);
            
    $filename $name.'.au3';
            
    // Send au3 file headers
            
    header('Content-Type: application/octet-stream');
            
    header('Content-Disposition: attachment; filename='.$filename);
            
    header('Content-Length: '.strlen($output));
            
    header('Pragma: no-cache');
            
    header('Expires: 0');

            print 
    $output;
            
    jexit(); // das hier fehlte
            

    siehe Kommentare

  4. #4
    Wohnt hier Avatar von Kubik-Rubik
    Registriert seit
    20.10.2005
    Ort
    Kubik-Rubik.de
    Beiträge
    2.737
    Bedankte sich
    177
    Erhielt 1.059 Danksagungen
    in 793 Beiträgen

    Standard

    bembelimen hat völlig recht!

    GET sollte nur gefiltert geholt und benutzt werden: http://wiki.joomla-nafu.de/joomla-do...k/JRequest/get

    SQL Queries nur maskiert verarbeiten:
    Code:
    $query = "
      SELECT * 
        FROM ".$db->nameQuote('#__example_table')."  
        WHERE ".$db->nameQuote('id')." = ".$db->quote('999999').";
      ";
    Info: http://docs.joomla.org/How_to_use_th...in_your_script

    Gruß
    Joomla! Extensions by Kubik-Rubik.de
    Keine Beantwortung von Supportanfragen per PN

    Joomla! braucht Dich!

  5. #5
    Neu an Board
    Registriert seit
    01.06.2005
    Ort
    Dortmund
    Alter
    42
    Beiträge
    26
    Bedankte sich
    3
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Danke an bembelimen und Kubik-Rubik.
    Kleiner Fehler große Ursache.
    Das mit dem $_GET[id] werde ich auch sofort ändern.
    Danke für den Hinweis.

    Grüße

    Olaf

  6. #6
    Neu an Board
    Registriert seit
    12.07.2008
    Ort
    Wien
    Beiträge
    15
    Bedankte sich
    1
    Erhielt 5 Danksagungen
    in 5 Beiträgen

    Standard

    db->quote ist nicht der richtige Weg, hier haben wir es ja mit (Ganz-)Zahlen zu tun.

    Für Input Sanitation hat Joomla das Praktische JRequest::getInt('dein get parameter name'). Dann kannst du sicher sein, dass du eine integer reinkriegst.

    Wenn du beim Query auch auf Nummer Sicher gehen willst, schreib einfach . ' WHERE n.id = '. (int)$id.''.

    JRequest kann auch getString und andere, da wird gleich für HTML Filterung und Escaping gesorgt, wenn du POST brauchst, schreib JRequest::getInt('variable',0,'POST');.

    Um aber auf die eigentliche Problemstellung zurückzukommen:

    Häng einfach tmpl=component an die URL an. Dann wird das Template rundherum nicht geladen sondern nur der Komponenten Output gerendert. Ich bin mir nicht 100% sicher, aber möglicherweise solltest du noch format=raw anhängen.

    Viele Grüße,

    Martin

+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein