2012-04-12 14 views
8

I documenti vengono creati dal sistema e salvati nella cartella/web/download. Ho creato una vista per visualizzare i collegamenti che consentiranno a un utente di scaricare i file, se l'utente fa clic sui collegamenti. (standard per scaricare la funzionalità)Come creare un collegamento per scaricare documenti generati in symfony2?

Sono nuovo di Symfony2 e sto spostando l'intero concetto di routing/controller, ma come si creerebbe un collegamento a tali file mentre si aderisce ancora al MVC? Si fa necessario impostare il routing con un controller o fa ramoscello avere caratteristiche che lo permettono, ecc

PS: Ho letto domande come How to create a download link in Symfony2? ma non ottengo se hanno fatto qualcosa in instradamento o link semplicemente aggiunti ecc.

Grazie,

risposta

6

Facciamo un esempio.

Pronuncia il tuo progetto in/www /, così/www/web/è la radice del documento della tua applicazione symfony2. Ora tutto ciò che si tenta di accedere in/www/web/over http://server/ verrà visualizzato.

/www/web/downloads/file.zip sarebbe raggiungibile a http://server/downloads/file.zip per impostazione predefinita.

+0

ok, solo per ricontrollare che capisco cosa stai dicendo. Costruisco un collegamento normale (all'interno della vista) che ha semplicemente href = "/ downloads/filename.extention" e symfony gestirà il resto per farlo diventare http: //server/downloads/filename.extention, che poi lavori? – ddtpoison777

+0

In tutti i casi l'ho usato, sì. –

34

Esempio implementazione sarebbe,

Creare un itinerario,

download_route: 
    pattern: /download/{filename} 
    defaults: { _controller: YourBundle:Controller:download } 

E poi nel controller,

public function downloadAction($filename) 
{ 
    $request = $this->get('request'); 
    $path = $this->get('kernel')->getRootDir(). "/../web/downloads/"; 
    $content = file_get_contents($path.$filename); 

    $response = new Response(); 

    //set headers 
    $response->headers->set('Content-Type', 'mime/type'); 
    $response->headers->set('Content-Disposition', 'attachment;filename="'.$filename); 

    $response->setContent($content); 
    return $response; 
} 

Per la generazione di link per il download di controllo Generating urls sezione del doc.

+0

Grazie per questo esempio basato su controller. Implementerà per vedere come funziona. – ddtpoison777

+0

Ho contrassegnato la risposta di Christian come accettata perché era appropriata per la portata del problema che avevo. Ma la tua risposta è anche corretta e intendiamo usarla in altre aree del progetto. Grazie ancora. – ddtpoison777

+1

Ho anche svalutato questa risposta, perché è un'alternativa. Il problema però non dovrebbe MAI essere risolto in questo modo, se è semplicemente un file per essere pubblicamente linkabile. Utilizza sempre questo approccio solo con file esterni allo spazio web pubblico, in cui non puoi collegarli con qualcos'altro (come un alias in apache) o quando hai bisogno di una logica applicata (restrizioni di accesso, limiti IP e così) che è necessario controllare all'interno dell'applicazione. –

5

Questa è la soluzione migliore che ho escogitato finora, consente di eseguire download al di fuori della cartella "/ var/www/web /", che rende il file non accessibile senza eseguire questo script utilizzato per servire il file.

In questo modo è possibile verificare se il downloader ha il permesso di scaricare il file che desidera.

In questo esempio ho usato "/ var/www/downloads /" dove ho memorizzare tutti i file voglio servire come download:

/** 
* http://api.symfony.com/2.2/Symfony/Component/HttpFoundation/BinaryFileResponse.html 
*/ 
use Symfony\Component\HttpFoundation\BinaryFileResponse; 

class OfflineToolController extends Controller 
{ 
    /** 
    * @return BinaryFileResponse 
    */ 
    public function downloadAction() 
    { 
     $path = $this->get('kernel')->getRootDir(). "/../downloads/"; 
     $file = $path.'my_file.zip'; // Path to the file on the server 
     $response = new BinaryFileResponse($file); 

     // Give the file a name: 
     $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT,'my_file_name.zip'); 

     return $response; 
    } 

} 

fonte: docs: http://symfony.com/doc/current/components/http_foundation/introduction.html

(dovrebbe funziona su versioni superiori a 2.2)

+0

Quale versione di Symfony dovrebbe funzionare? Immagino non nel mio (2.0). Lo so, lavoro con uno molto vecchio ... – ElPiter

+0

Non sono sicuro di quale sia la versione, penso 2.2 in base alla data della mia risposta e so che abbiamo usato una versione recente. – Andy

4

L'aggiunta del percorso del file all'attributo href non ha funzionato per me.

Quando si fa clic, visualizza semplicemente il file senza scaricarlo veramente.

Ciò che ha funzionato per me è aggiungere un attributo download al mio collegamento che è un attributo HTML5. Basta aggiungere l'attributo in questo modo:

<a href="path/to/file" download>Download Link</a> 

Facendo clic sul collegamento, sarà solo scaricare il file senza alcun codice lato server.

È anche possibile assegnare un valore all'attributo download.

<a href="path/to/file" download="filename.txt">Download Link</a> 

Il valore dell'attributo download verrà utilizzato come nome del file del file scaricato, invece di quello usato mentre era memorizzato sul server.

Ho seguito lo tutorial nel sito Web Symfony per la gestione del caricamento dei file. L'ho trovato utile quando stavo cercando di creare un collegamento per il download del file. Ho appena aggiunto un metodo all'entità Document denominata getDownloadFileName() che restituisce solo il nome del file che desidero assegnare all'attributo download.

Quindi, in pratica, questo è come ho implementato sul modello ramoscello di mio progetto Symfony

<a href="{{ asset(file.webPath) }}" download="{{ file.downloadFileName }}"> 
Download Link 
</a> 
0

Non so se questo si adatta, ma tenere presente un altro ultra semplice alternativa a mente:

vale a dire a suo avviso:

<a class='north' href="{{ asset('bundles/TP/Resume.pdf') }}" target="_blank" title="Download.pdf"><img src="{{ asset('bundles/TP/images/icn-save.jpg') }}" alt="Download the pdf version" /></a> 

si apre il file, e l'utente ha la decisione se vuole stamparlo, scaricarlo ... ecc

Problemi correlati