2014-03-03 4 views
6

Um eine saubere Verzeichnisstruktur zu erhalten, möchte ich einen zusätzlichen Asset-Ordner veröffentlichen. Ich habe ein Verzeichnis 'Assets' in meinem Projektordner erstellt, einen 'PictureAssets' Controller geschrieben, der fast identisch mit 'Controller.Assets' ist, 'Assets' zu den playAssetsDirectories in der Datei build.sbt hinzugefügt und einige Routeneinträge ohne verfolgt Erfolg.Spielen: zusätzliches öffentliches Verzeichnis/Assets

PictureAssets:

package controllers 

import play.api.mvc.Action 
import play.api.mvc.AnyContent 

object PictureAssets extends AssetsBuilder { 
    def create : Action[AnyContent] = Action { 
     Ok(views.html.fileUploadForm()) 
    } 
} 

build.sbt

playAssetsDirectories <+= baseDirectory/"assets" 

Routen

# GET  /file     controllers.PictureAssets.at(path="/assets", file="MM1.png") 
GET  /datei/*file   controllers.PictureAssets.at(path="/assets", file) 
# GET  /datei/*file   controllers.Assets.at(path="/assets", file) 

Wenn ich versuche, auf die URL zugreifen, entweder nichts angezeigt wird, oder der Fehler ‚Das Bild http: 9000 // localhost/datei/MM1.png kann nicht angezeigt werden, weil es Fehler enthält 'wird angezeigt oder die CSS-Referenz s, die von den 'controller.Assets' gehandhabt werden, funktionieren nicht mehr.

Was fehlt mir?

Antwort

5

Ich denke, das Problem kommt von der Tatsache, dass die at Methode verwendet wird, die standardmäßig von Assets zuvor verwendet wurde.

Ich lief in das gleiche Problem irgendwann im letzten Jahr, wo ich wollte Bilder dienen, die in einem externen Ordner gespeichert werden würden, einen Ordner, der irgendwo auf der Festplatte ist, und hier ist, wie ich dies codierte:

ich eine einfache Steuerung erstellt Fotos genannt, die eine Aktion enthalten:

object Photos extends Controller { 

    val AbsolutePath = """^(/|[a-zA-Z]:\\).*""".r 

    /** 
    * Generates an `Action` that serves a static resource from an external folder 
    * 
    * @param absoluteRootPath the root folder for searching the static resource files. 
    * @param file the file part extracted from the URL 
    */ 
    def at(rootPath: String, file: String): Action[AnyContent] = Action { request => 
    val fileToServe = rootPath match { 
     case AbsolutePath(_) => new File(rootPath, file) 
     case _ => new File(Play.application.getFile(rootPath), file) 
    } 

    if (fileToServe.exists) { 
     Ok.sendFile(fileToServe, inline = true) 
    } else { 
     Logger.error("Photos controller failed to serve photo: " + file) 
     NotFound 
    } 
    } 

} 

Dann in meinen Routen, definierte ich folgende:

GET /photos/*file controllers.Photos.at(path="/absolute/path/to/photos",file) 

Diese ganz gut fo gearbeitet r ich. Hoffe das hilft.

PS: Dies war zusätzlich zu den normalen Assets Controller, die helfen, js und CSS-Dateien dienen.

+0

danke, ich musste 'val fileToServe = neue Datei (Play.application.getFile (rootPath), Datei)' für einen relativen Pfad, in meinem Fall. –

+0

@Peter Ich portierte dies nach Java und es funktionierte :) Danke. Würde das skalieren wenn ich eine große Anzahl von Bildern im Ordner auf dem absoluten Pfad habe? – ajay