關於Play框架的靜態檔案

yifanwu發表於2021-09-09

Play框架的主要功能是提供動態響應的內容。但一個網路專案中必然有大量的靜態內容,比如圖片、Javascript檔案、CSS檔案等。我下面介紹如何在Play專案中加入靜態檔案。

 

預設路徑

Play專案的靜態檔案一般儲存在根目錄下的public資料夾。新建Play專案時,routes檔案會有下面的預設記錄:

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)

該記錄將/assets/下的URL,對應到專案的/public資料夾內的檔案。比如在專案的/public/images/test.jpg,就可以透過/assests/images/test.jpg這一URL訪問:

圖片描述

其它型別的靜態檔案,也都可以放入/public資料夾中。 

在Play的模板中,也可以利用@routes.Assets.at("images/test.jpg")的方式,來呼叫靜態檔案的URL。

 

檔案上傳

客戶有時需要自行上傳檔案。我可以透過一個表單來讓客戶上傳。表單的模板app/views/upload.scala.html為:


@helper.form(action = routes.Application.upload, 'enctype -> "multipart/form-data") {
    
    

                         

}


 

增加動作uploadForm(),用於顯示該模板:

public static Result uploadForm() {
    return ok(views.html.upload.render());
}

 

檔案上傳的介面如下:

圖片描述

 

對於表單提交,我用動作upload()來處理:

public static Result upload() {
          MultipartFormData body = request().body().asMultipartFormData();
          FilePart picture = body.getFile("picture");
          if (picture != null) {
            String fileName = picture.getFilename();
            String contentType = picture.getContentType(); 
            File file   = picture.getFile();
            // get the root path of the Play project
            File root = Play.application().path();
            // save file to the disk
            file.renameTo(new File(root, "/public/uploads/" + fileName));
            return ok(fileName + " " + contentType + " uploaded");
     } else {
            return badRequest("not a valid file");    
     }
}


這裡透過multipart/form-data的加密方式,來傳輸靜態檔案。檔案傳輸成功後,我提取出File型別的檔案物件,並利用renameTo()方法,將檔案儲存到/public/uploads路徑下。

 

CoffeeScript和LESS

Play中可以用CoffeeScript編寫前端JavaScript。建立app/assets/javascripts資料夾。資料夾中放入.coffee檔案,比如test.coffee。Play將自動把.coffee檔案編譯成.js檔案。在模板中,可以透過

@routes.Assets.at("javascripts/test.js")

@routes.Assets.at("javascripts/test.min.js")

來分別呼叫.js檔案或壓縮後的.js檔案。用於routes中的設定,也可以用/assets/javascripts/test.js直接訪問。

 

Play還可以用LESS來編寫CSS檔案。在app/assets/stylesheets中放入.less檔案,Play將自動編譯。用

@routes.Assets.at("stylesheets/test.css")

@routes.Assets.at("stylesheets/test.min.css")

在模板中訪問。或者用/assets/stylesheets/test.css直接訪問。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2157/viewspace-2809046/,如需轉載,請註明出處,否則將追究法律責任。

相關文章