Contao-Camp 2024
Ergebnis 1 bis 7 von 7

Thema: Eindeutige Download Links / Unique Downloads

  1. #1
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard Eindeutige Download Links / Unique Downloads

    Hallo an die Community,
    ich habe ein Problem bei dem ich nicht weiterkomme.
    Ich habe auf einer Seite mehrere Downloads eingebaut, die nachdem bekannten Schema http://www.domain.tld/downloads.html.../zur/datei.pdf abläuft.

    Diesen Download Link würde ich gerne per E-Mail oder anderen Kanälen weitergeben. Jetzt ist aber so, dass sie sich die Datei dahinter ändert und zwar nicht nur der Inhalt (weil dann könnte man die Datei ja einfach überschreiben), nein auch der Dateiname soll sich ändern (z.B. Versionsnummer und/ oder Datum).

    Es bräuchte also so eine Art Unique ID für den Download, ungefähr so:
    www.domain.tld/downloads.html?file=abcde1234 <- und das sollte man am besten noch selbst wählen können (würde ich per DCA als unique Feld definieren)
    Gibt es einen Hook, den ich beim Download Elemente nutzen könnte?

    Ich hoffe, ich konnte verständlich machen, wo ich gerade hänge.

    grüße

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.883
    Partner-ID
    10107

    Standard

    Das würde ich als eigenes Element umsetzen.

  3. #3
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Von wievielen Links sprichst du denn da? Und soll sich auf dem Link ohne weitere "Vorwarnung" direkt die Datei öffnen, oder soll der Nutzer schon erstmal auf eine Seite kommen und ggf. per Sprunglink zu dem Abschnitt mit der Datei geleitet werden?

  4. #4
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Das würde ich als eigenes Element umsetzen.
    Was ist die beste Vorgehensweise? ContentDownload.php vom Core als Grundlage nutzen und dann eigene Sachen dazupacken?

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.883
    Partner-ID
    10107

    Standard

    Ja, zB . Wobei du nicht allzuviel von der existierenden ContentDownload Klasse übernehmen wirst können.

    Du könntest ein weiteres Feld im DCA hinzufügen, wo du einen Alias vergeben kannst und dann dementsprechend einen Link erzeugen, der vielleicht …?filealias=… lautet (statt …?file=…) und dann auf diesen filealias Parameter überprüfen und dementsprechend die Datei aus der Datenbank laden und dann an den Browser senden.

  6. #6
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du könntest ein weiteres Feld im DCA hinzufügen wo du einen Alias vergeben kannst
    erledigt
    Zitat Zitat von Spooky Beitrag anzeigen
    und dann dementsprechend einen Link erzeugen, der vielleicht …?filealias=… lautet (statt …?file=…) und dann auf diesen filealias Parameter überprüfen und dementsprechend die Datei aus der Datenbank laden und dann an den Browser senden.
    Genau an dieser Stelle hänge ich.. in welcher Datei mache ich das? also die Abfrage. Wie ich dann die Datei aus der Datenbank komme und sie an den Browser sende, wüßte ich glaub, aber wo grätsche ich mit meiner Abfrage rein?
    In der ContentDownload.php ist diese Stelle ...
    PHP-Code:
    $file = \Input::get('file'true);
    // Send the file to the browser and do not send a 404 header (see #4632)
    if ($file != '' && $file == $objFile->path){
    \
    Controller::sendFileToBrowser($file);

    Diese Logik müsste ich dann irgendwie mit
    PHP-Code:
    $file = \Input::get('fileUnique'true); 
    abfangen...

    Wie gesagt, an der Stelle komme ich gerade nicht weiter...

  7. #7
    Contao-Fan Avatar von dhe
    Registriert seit
    25.10.2010.
    Ort
    Esslingen a.N.
    Beiträge
    657

    Standard

    Sodala,
    ich hab es glaube ich hinbekommen, allerdings weiß ich nicht, wie gut der Code ist, oder ob das Schwachstellen offenbart (außer meinem PHP Skills), hab es über den generatePage Hook gelöst (den ich sowieso für ein anderes Problem brauche...

    config.php
    PHP-Code:
    $GLOBALS['TL_HOOKS']['generatePage'][] = array('neckarpixel\npsystem''npGeneratePage'); 
    dca/tl_content.php
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'addUnique';
    /* Palettes */
    $GLOBALS['TL_DCA']['tl_content']['palettes']['download'] = str_replace(',titleText',',titleText,addUnique',$GLOBALS['TL_DCA']['tl_content']['palettes']['download']);
    /* Subpalettes */
    $GLOBALS['TL_DCA']['tl_content']['subpalettes']['addUnique']    = 'uniqueID';

    /* FIELDS */
    // UNIQUE DOWNLOAD ID
    $GLOBALS['TL_DCA']['tl_content']['fields']['addUnique'] = array
    (
        
    'label'                 => &$GLOBALS['TL_LANG']['tl_content']['addUnique'],
        
    'exclude'               => true,
        
    'inputType'             => 'checkbox',
        
    'eval'                  => array('tl_class'=>'w50 w12''submitOnChange' => true),
         
    'sql'                    => "char(1) NOT NULL default ''"
    );

    $GLOBALS['TL_DCA']['tl_content']['fields']['uniqueID'] = array
    (
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_content']['uniqueID'],
        
    'exclude'                 => true,
        
    'search'                  => true,
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>200,'tl_class'=>'w50''mandatory' => true'unique' => true'spaceToUnderscore' => true'doNotCopy' => true'rgxp' =>'alias'),
        
    'sql'                     => "varchar(255) NOT NULL default ''"
    ); 
    classes/npsystem.php
    PHP-Code:
    /**
     * Namespace
     */
    namespace neckarpixel;


    class 
    npsystem {

        public function 
    npGeneratePage$objPage$objLayout$objPageRegular){

            
    // Send the file to the browser and do not send a 404 header (see #4632)
            
    if (\Input::get('dl')) {
                
    $file = \Input::get('dl');

                if(
    $objElement = \ContentModel::findBy('uniqueID'$file)) {

                    
    $objFile = \FilesModel::findByUuid($objElement->singleSRC);
                    \
    Controller::sendFileToBrowser($objFile->path);
                }
            }


    ce_download.html im templates ordner
    PHP-Code:
    <?php $this->extend('block_searchable'); ?>

    <?php $this->block('content'); ?>

      <?php
      
      $strDownload 
    $this->href;
      if(
    $this->addUnique) :
        
    $strHref = \Environment::get('request');
        
    // Remove an existing file parameter (see #5683)
        
    if (preg_match('/(&(amp;)?|\?)file=/'$strHref))
        {
          
    $strHref preg_replace('/(&(amp;)?|\?)file=[^&]+/'''$strHref);
        }

        
    $strHref .= ((\Config::get('disableAlias') || strpos($strHref'?') !== false) ? '&amp;' '?') . 'dl=' $this->uniqueID;

        
    $strDownload $strHref;
      endif;
    ?>

      <a href="<?= $strDownload ?>" title="<?= $this->title ?>"><i class="icon-download"></i><span class="desc"><?= $this->link ?> <span class="size"><?= strtoupper($this->extension) . ' | ' $this->filesize ?></span></span></a>

    <?php $this->endblock(); ?>
    Es funktioniert, das ist gerade die Hauptsache. Jemand ein Idee, ob man das besser lösen könnte?

    grüße

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

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