2017-02-22 1 views
1

L'objectif est de pouvoir télécharger et afficher (par exemple, des images de profil) des images qui sont soit publiques soit privées.Impossible de localiser les fichiers avec cadre de lecture Fonction sendFile

Dans le Play Framework docs (ScalaStream), il dit:

Play permet d'aides faciles à utiliser pour tâche commune de servir un fichier local:

def index = Action { 
    Ok.sendFile(new java.io.File("/tmp/fileToServe.pdf")) 
} 

Si vous voulez servir ce fichier en ligne :

def index = Action { 
    Ok.sendFile(
    content = new java.io.File("/tmp/fileToServe.pdf"), 
    inline = true 
) 
} 

Cela ressemble w chapeau est nécessaire pour atteindre l'objectif.

Maintenant, j'ai une structure de répertoire comme indiqué ci-dessous, et voudrais servir les fichiers 1.png et 2.png

MyApp 
|_ app 
|_ conf 
|_ public (all public assets) 
    |_ images 
     |_ 1.png 
|_ private (more assets, not public) 
    |_ images 
     |_ 2.png 
|_ ... 

J'ai défini une fonction de contrôleur comme suit:

def sendImage() = Action { 
    // Ok.sendFile(new java.io.File("/public/images/1.png")) 
    // Ok.sendFile(new java.io.File("assets/images/1.png")) 
    Ok.sendFile(new java.io.File("/private/images/1.png")) 
} 

Essayé divers chemins différents, absolus, relatifs, mais quand j'appelle cette fonction de contrôleur du front-end (React/Axios), il renvoie seulement "NoSuchFileException".

Cependant, je suis en mesure de rendre les biens publics de la fin avant la simple utilisation:

<img src='/assets/images/1.png' /> // from the public dir 

Le même chemin ne fonctionne pas à l'intérieur du contrôleur. Impossible de comprendre comment Play attend ses chemins.

Actuellement en cours d'utilisation Play 2.5

Des idées? Merci

+0

Lorsque vous utilisez '/' avant le nom de fichier, le chemin complet du fichier est attendu et non le chemin relatif. Vous devez passer de '" /private/images/1.png "' à "" private/images/1.png "' pour que ce soit relatif à votre application. Mais, si ces fichiers privés sont téléchargés par l'utilisateur, les avoir dans le répertoire de l'application serait considéré comme une mauvaise pratique. Que se passe-t-il lorsque vous déployez une nouvelle version de l'application? Vous perdrez les fichiers ou vous devrez les copier/déplacer pendant le déploiement. Disposez donc d'un répertoire externe à l'application pour stocker les fichiers téléchargés. – marcospereira

Répondre

0

Le commentaire par @marcospereira est ce qui a aidé à résoudre le chemin, merci!

Lorsque vous utilisez / avant le nom de fichier, cela suppose le chemin d'accès complet du fichier et non un chemin relatif. Vous devez passer de /private/images/1.png à private/images/1.png pour que ce soit relatif à votre application. Mais, si ces fichiers privés sont téléchargés par l'utilisateur, les placer dans le répertoire de l'application serait considéré comme une mauvaise pratique. Que se passe-t-il lorsque vous déployez une nouvelle version de l'application? Vous perdrez les fichiers ou vous devrez les copier/déplacer pendant le déploiement. Disposez donc d'un répertoire externe à l'application pour stocker les fichiers téléchargés.

0

injectez play.api.Application objet dans votre contrôleur et utilisez la méthode getFile définie dans l'objet d'application comme indiqué ci-dessous.

class JobInstanceController @Inject()(protected val app: Application) extends Controller { 
    def test = Action { 
    Ok.sendFile(app.getFile("public/images/1.png")) 
    } 
}