7

In Grails 3.0 come si esegue il mapping di un URL a un file nella cartella assets?UrlMappings per puntare un URL a un file pipeline di asset in Grails

Ad esempio:
http://localhost:8080/favicon.ico ->grails-app/assets/images/bookmark.ico

Ho provato un paio di mappature di test, come ad esempio:

Grails-app/controllers/UrlMappings.groovy

class UrlMappings { 

    static mappings = { 
     ... 
     "/t1.png" (uri: "/assets/images/test.png") 
     "/t2.png" (uri: "/assets/test.png") 
     "/t3.png" (uri: "/images/test.png") 
     "/t4.png" (dir: "assets/images", file: "test.png") 
     ... 
     } 

} 

... ma provocano tutti un errore di 500 server.

risposta

0

Penso che è necessario per mappare l'URL AssetController del Plugin patrimoniale, come questo (non testato):

class UrlMappings { 
    static mappings = { 

    ... 

    "/files/$id" (controller :"AssetController", action:"index") 
     ... 
    } 
} 

HTH

+0

Questo è un approccio interessante, ma sembra solo risultato in 404s (ho anche provato varie altre permutazioni usando 'AssetController' senza successo). Hai un esempio di lavoro specifico? –

+0

In realtà no, era solo un'idea. Ho dato un'occhiata al 'AssetController' un pensiero che potrebbe funzionare ... Forse un'occhiata a 'AssetTagLib' ti aiuta a capire il' AssetPlugin' e puoi scrivere il tuo Controller che le cose che vuoi. – YAT

0

Se non si utilizza l'Asset-Pipeline è possibile mappare risorse statiche agli URL seguendo i passaggi descritti nello Grails Documentation. Tuttavia, la tua domanda ti chiede come associare una singola risorsa a un singolo URL con lo Asset-Pipeline plugin.

Burt Beckwith ha fornito alcuni approfondimenti sullo Grails forum alcuni anni fa circa il ruolo di Graal nel servire le risorse statiche.

Grails non serve risorse statiche, il contenitore lo fa. Quindi non c'è modo di configurare direttamente una mappatura: è necessario servirla attraverso un controller o configurare un proxy come suggerisce Eric.

Burt

Questa risposta può essere insoddisfacente. Ma se devi servire una risorsa statica e assolutamente non vuoi usare un controller o un proxy puoi provare quanto segue.

Creare una vista denominata image.gsp. La vista conterrà solo un tag di asset. Usando le esempi precedenti,

<asset:image src="t1.png"/> 

quindi configurare le mappature URL per puntare alla pagina image.gsp.

class UrlMappings { 

    static mappings = { 
     ... 
     "/t1.png" (view: "image") 
     ... 
     } 

} 

Riconosco che questo potrebbe non essere il metodo esatto che speravate di usare. Tuttavia, ritengo che comprendere il ruolo svolto da Grails rispetto al contenitore di Grails contribuirà a informare la decisione di servire correttamente una risorsa per l'utente.

So che questo può sembrare non correlato ma se si desidera creare una pagina che elenca i contenuti di una directory, controllare questo post by CodePanda. Il suo codice può essere usato come modello per creare un controller per servire un singolo file e spiega come aggiornare vista, controller e groovy.config.

+0

Questa soluzione funziona davvero? Sembra molto simile a "" /t3.png "(uri:" /images/test.png ")' dalla domanda originale, e questo non funziona per me. Si noti che la domanda riguarda il mapping di un URL (** singolare **) a un file (** singolare **). –

+0

Ho verificato che ha funzionato. Prova a mappare su un file al di fuori della cartella delle risorse. Inseriscilo nella directory del progetto Grails e verifica se è possibile mappare un URL ad esso. – Nathan

+0

Quale URL hai usato? (nota: la mappatura su un file al di fuori della cartella 'assets' non ha alcun valore in quanto non è nemmeno necessario il mapping.) –

0

Ecco quello che ho usato per servire fino swfobject.js ad una specifica URI:

Aggiungi una mappatura URL:

"/swf/swfobject.js" (controller:"facerecorder", action:"swfobject") 

aggiungere un'azione al controller che individua la risorsa e lo serve. Si noti che il assetResourceLocator, che fa parte della pipeline degli asset, viene iniettato nel controller.

class FacerecorderController { 

    def assetResourceLocator 

    def swfobject() { 
     def resource = assetResourceLocator.findAssetForURI('swf/swfobject.js') 
     render file: resource.inputStream, contentType: 'text/javascript' 
    } 
} 

Non è sicuramente l'ideale, ma funziona. Testato con Grails 3.0.17