playframework playframework-2.2

playframework - Asset mapping fuera de la carpeta pública en Play framework



playframework-2.2 (4)

En aras de la exhaustividad, he experimentado este problema muchas veces y no ha habido una respuesta suficiente para ello.

Típicamente, nginx enfrentaría el mundo exterior y el proxy inverso en el servidor de aplicaciones . No desea publicar archivos directamente desde Play, especialmente si está creando rutas, lo que puede presentar riesgos de seguridad. Permita que los expertos manejen archivos estáticos, es decir, nginx.

Play Framework es compatible con el directorio "dist" de sbt-native-packager, que adjuntará cualquier archivo allí dentro del paquete ZIP de distribución [1]. Aquí está la documentación para eso:

dist → Arbitrary files to be included in your projects distribution

Para los casos de uso tales como las descargas controladas, use X-Accel de nginx, donde a través de un encabezado de respuesta le dice a nginx qué archivo enviar al cliente.

TLDR: use nginx para lo que está hecho, use Play para lo que está hecho.

Tenemos una gran lista de imágenes que necesitamos almacenar en una ruta externa ... es decir, fuera de la carpeta de aplicaciones de reproducción.

¿Cómo podemos hacer que esté disponible para jugar como un activo para que se transmita como un servidor web?


Una solución hacky sería incluir en su carpeta pública sbt play un enlace simbólico a la ubicación donde desea cargar los archivos. El enlace simbólico se empacará en el ensamblado y será funcional en tiempo de ejecución.

cd ~/your/playframework/awesome/project/public ln -s ''/var/lib/funky-data-set-for-my-awesome-project/'' funky-data

Ahora puede usar en su archivo de rutas algo así como:

GET /funky/assets/*file controllers.Assets.at(path="/public/funky-data", file)

La desventaja de esto es que su entorno stage / dev / prod debe tener ese contenido que necesita en la misma ubicación.


Juega 2.5

archivo: rutas

GET /external_resources/*file controllers.ImagesController.getImage(path="/home/project_name/external/images", file: String)

archivo: ImagesController

package controllers; import play.mvc.Controller; import play.mvc.Result; import java.io.File; /** * Created by js on 6/1/17. */ public class ImagesController extends Controller { public Result getImage(String path, String image) { System.out.println(path); System.out.println(image); image = image.replace("%20", " "); File file = new File(path + image); return ok(file); } }


Probablemente hayas visto la documentación de Play sobre los activos . Además de los activos estándar de Play, puede definir el suyo propio.

En conf/routes necesita agregar una línea para su activo externo:

# Static resources (not managed by the Play framework) GET /my_external_assets/*file controllers.ExtAssets.at(file) # Play''s standard assets GET /assets/*file controllers.Assets.at(path = "/public", file)

Y luego debes definir tu controlador de activos. Un simple ejemplo de cómo se podría hacer:

public class ExtAssets extends Controller { public Result at(String filePath) { File file = new File(filePath); return ok(file, true); } }