2017-02-22 4 views
1

Целью является возможность как загрузки, так и рендеринга (например, профиля pic) изображений, которые являются либо государственным, либо частным.не удалось найти файлы с помощью функции play. Функция sendFile

В Play Framework docs (ScalaStream), он говорит:

Play обеспечивает легкий в использовании помощников для общей задачи обслуживания локального файла:

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

Если вы хотите, чтобы обслуживать этот файл инлайн :

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

Это выглядит как ж шляпа необходима для достижения цели.

Теперь у меня есть структура каталогов, как показано ниже, и хотел бы служить файлы 1.png и 2.png

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

Я определил функцию контроллера следующим образом:

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")) 
} 

Пробовал различные разные пути, абсолютные, относительные, но когда я вызываю эту функцию контроллера из front-end (React/Axios), она возвращает только «NoSuchFileException».

Однако, я могу оказывать государственные активы от переднего конца просто с помощью:

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

Тот же путь не работает внутри контроллера. Не удалось выяснить, как Play ожидает его пути.

В настоящее время используется Воспроизведение 2.5

Любые идеи? Спасибо

+0

Когда вы используете '/' перед именем файла, это ожидает полный путь к файлу, а не относительный. Вам нужно перейти от «/private/images/1.png» к «private/images/1.png», чтобы он был относительно вашего приложения. Но, если эти личные файлы загружаются пользователем, их внутри каталога приложений будет считаться плохой практикой. Что произойдет при развертывании новой версии приложения? Вы либо потеряете файлы, либо вам придется копировать/перемещать их во время развертывания. Итак, у вас есть каталог, который является внешним для приложения для хранения загруженных файлов. – marcospereira

ответ

0

Комментарий по @marcospereira, что помогло решить путь, спасибо!

Когда вы используете / перед именем файла, это ожидает полный путь к файлу, а не относительный. Вам необходимо изменить с /private/images/1.png на private/images/1.png так, чтобы он был относительно вашего приложения.

Но если эти личные файлы загружаются пользователем, их внутри каталога приложений будет считаться плохой практикой. Что произойдет при развертывании новой версии приложения? Вы либо потеряете файлы, либо вам придется копировать/перемещать их во время развертывания. Итак, у вас есть каталог, который является внешним для приложения для хранения загруженных файлов.

0

введите play.api.Application объект в контроллер и используйте метод getFile, определенный в объекте приложения, как показано ниже.

class JobInstanceController @Inject()(protected val app: Application) extends Controller { 
    def test = Action { 
    Ok.sendFile(app.getFile("public/images/1.png")) 
    } 
} 
Смежные вопросы