2016-09-10 2 views
1

У меня есть простая форма с 2 текста и 1 файл вводаPlay: Как предотвратить 404 на изображение ЦСИ по первому требованию после загрузки

@helper.form(action = routes.CharactersController.newCharacter(), 'enctype -> "multipart/form-data") { 
    @helper.inputText(field = characterForm("characterName")) 
    @helper.inputText(field = characterForm("characterRealName")) 
    @helper.inputFile(field = characterForm("characterImage")) 

    <p> 
     <input type="submit"> 
    </p> 
} 

в действии newCharacter переместить файл в папку активов ,

Http.MultipartFormData body = request().body().asMultipartFormData(); 
Http.MultipartFormData.FilePart<File> picture = body.getFile("characterImage"); 
File file = picture.getFile(); 
file.renameTo(new File(LinkUtil.getCharacterUploadPath(), imageName + ".jpg")); 

, а затем сделать редирект на/показать страницу, чтобы отобразить новый введенный символ

return redirect(routes.CharactersController.show(character.id, OrderType.MAIN.name())); 

на вновь загруженной странице я получаю только разбитое изображение и увидеть 404 в консоли для образ. Когда я перезагружаю страницу, изображение отображается как ожидалось.

Итак, какая часть не готова при перенаправлении? Является ли это переименованием или действительно нужно какое-то время, чтобы найти новый актив? И как я могу обеспечить, чтобы все было готово до перенаправления?

Edit: Чтобы улучшить мой вопрос

Я использую играть 2.5

LinkUtil.getCharacterUploadPath() решает "общественные/изображения/символы /"

Я встраивание изображение в моем шоу-шаблон:

<img src="@character.getImagePath"> 

, который затем решает в «/assets/images/characters/imagename.jpg»

Edit 2: Дальнейшие исследования:

При проверке файловой системы в действии newCharacter с чем-то вроде File.Exists() для нового пути, я правда. Таким образом, переименование/перемещение частично завершено. Однако, если я пытаюсь получить ресурс с помощью среды

environment.getResource("relativePathToFile"); 

это нуль. Даже в цикле while ресурс остается равным нулю. Кажется, это указывает на то, что файл еще не добавлен в classpath. К сожалению, независимо от того, как долго я остаюсь в действии, ресурс всегда равен нулю. Но когда я помещаю Thread в режим сна за 2000 мс, а затем снова проверяю ресурс в действии шоу, он правильно решается. Но только если я жду 2 секунды.

Еще один тест заключался в использовании onerror = "window.location.reload()" на изображении. Это приводит к примерно 5-10 перезагрузкам до того, как изображение будет найдено.

Таким образом, это определенно вопрос времени, но включение Thread для сна на произвольную сумму кажется несправедливым. Должен быть способ убедиться, что файл доступен в пути к классам.

Каждый намек/идея оценивается.

ответ

0

Я получил его на работу! Сначала мой подход выше был ошибочным.

Загрузка загруженных изображений, размещение их в общей папке и попытка их обслуживания с помощью AssetController не будут работать над производственной сборкой. Все в общей папке упаковано в файл .jar. И некоторые быстрые тесты намекали, что мое renameTo сверху не будет помещать изображения там, где я ожидал их.

Так вот мое решение:

Определить новый маршрут:

GET  /files/*file controllers.Images.serve(file) 

В действии использовать абсолютный путь в файловой системе

public class Images extends Controller { 
    public Result serve(String file) { 
     return ok(new java.io.File("/var/www/files/" + file)); 
    } 
} 

доступ к файлу с чем-то вроде этого

<img src="/files/images/characters/imagename.jpg"> 

Изображение доступно мгновенно по запросу на переадресацию.

Мое предположение о задержке в вопросе заключается в том, что игра пытается скомпилировать все, что добавлено в путь класса, прежде чем сделать его доступным.

 Смежные вопросы

  • Нет связанных вопросов^_^