2016-09-10 27 views
1

後,我有一個簡單的形式在newCharacter行動2文本和1個文件輸入播放:如何防止404對第一個請求圖片src上傳

@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> 
} 

我的文件移動到文件夾資產。

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的控制檯,圖片。當我重新加載頁面時,圖像按預期呈現。

那麼哪個部分沒有準備好時,我重定向?是重新命名還是玩遊戲需要一些時間來尋找新的資產? 我如何確保在重定向之前一切都準備就緒?

編輯: 爲了提高我的問題

我用打2.5

LinkUtil.getCharacterUploadPath()解析爲 「公共/圖片/文字/」

我嵌入圖像在我的節目模板是這樣的:

<img src="@character.getImagePath"> 

然後解析爲「/assets/images/characters/imagename.jpg」

編輯2:進一步的調查:

當我檢查的東西,如file.exists()的新路徑newCharacter行動中的文件系統,我得到真正的。所以重命名/移動部分似乎完成了。 但是,如果我試圖通過環境獲取資源

environment.getResource("relativePathToFile"); 

它是空的。即使在一個while循環內,資源仍然爲空。這似乎表明該文件還沒有真正添加到類路徑中。不幸的是,無論我留在行動中多久,資源始終爲空。但是當我把線程休眠2000ms,然後在show動作中再次檢查資源時,它會得到正確解決。但只有等待2秒。

另一個測試是在圖像上使用onerror =「window.location.reload()」。在找到圖像之前會導致大約5-10次重新加載。

所以它只是一個時間問題,但是將線程置於任意數量的睡眠狀態顯然是錯誤的。 必須有一種方法來確保文件在類路徑中可用。

每一個提示/想法表示讚賞。

回答

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

可以通過重定向請求立即訪問該圖像。

我對問題的延遲的猜測是,該遊戲嘗試編譯所有添加到類路徑中的內容,然後使其可訪問