Controllerに form helperを使わずにログイン情報を渡す方法
まず、以下のサイトの通りでログイン認証を実装したのちのご質問になります。
ほぼ丸々同じです。
http://akiomik.hatenablog.jp/entry/2013/02/07/211054
画像アップロードの機能を備えたいと考えているのですが、ドキュメントの通りに書いてしまうと、tmpフォルダに全ての画像が入ってしまう(?)ため、アカウントID(かprimary key)ごとにフォルダを別に分けて保存できないかと思われ、以下のように書いてみました。ですがこのファイルではhelperformからloginNameを取得していないため、当然ながら、
value loginName is not a member of play.api.data.Form[com.github.j5ik2o.spetstore.application.controller.LoginCustomer]
の一文がコンパイルエラーとして出てしまいます。(なお引数が足らないとエラーで出てしまうことと、画像をアップロードするview(profpicsupload.scala.html)にもloginNameを渡したいと思ったため、@Inject の後に引数として val loginFormをとりあえず入れてあります)
また以前ご回答いただいた際に、クラスではなくシングルトンオブジェクトにすれば、例えば、上記の
case class LoginCustomer (
email: string
loginName: string
password: string
)
の情報を form ( val loginForm = Form(...) )をつかったmappingで取得し、 これを例えば以下のメソッド;
def toprofpics(loginForm: LoginCustomer): Unit = ProfpicsUploadController.toprofpics(loginForm)
で渡せばいいのかもとふと思いましたが、そもそもシングルトンオブジェクトにしてしまうとアクションメソッドを使えなくなってしまうのでどうにもならないと気づきました。これでうまくいくわけがないというのはわかってるのですが、こういう場合(アカウントごとに画像を整理して保存したい場合)どうすべきなのでしょうか。ご回答いただければ幸いです。
package com.github.j5ik2o.spetstore.application.controller
import javax.inject._
import play.api._
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import com.github.j5ik2o.spetstore.domain.model.customer._
import com.github.j5ik2o.spetstore.application.controller.json._
import play.api.i18n.{ I18nSupport, MessagesApi }
import play.api.i18n.Messages.Implicits._
import scala.util.Random
import java.io.File
import java.nio.file.{ Files, Path, Paths }
import akka.stream.IOResult
import akka.stream.scaladsl._
import akka.util.ByteString
import play.api.libs.streams._
import play.api.mvc.MultipartFormData.FilePart
import play.api.mvc._
import play.core.parsers.Multipart.FileInfo
import scala.concurrent.{ ExecutionContext, Future }
import java.sql.Connection
import scalikejdbc._
import scalikejdbc.SQLInterpolation._
case class ProfpicsUploadData(name: String)
class ProfpicsUploadController @Inject() (val messagesApi: MessagesApi, val messagesApi2: MessagesApi,
val loginForm:
Form[com.github.j5ik2o.spetstore.application.controller.LoginCustomer])(implicit executionContext: ExecutionContext)
extends Controller
with play.api.i18n.I18nSupport with Secured {
private val logger = Logger(this.getClass)
val profpicsUploadForm = Form(
mapping(
"name" -> text
)(ProfpicsUploadData.apply)(ProfpicsUploadData.unapply)
//標準のボディパーサを使ったupload
def upload = Action(parse.multipartFormData) { request =>
request.body.file("picture").map { picture =>
import java.io.File
val name = picture.filename
val contentType = picture.contentType
val loginName = loginForm.loginName.toString
try {
DB readOnly { implicit s =>
val primarykey = sql"select pk from customer where loginName = ${loginName}"
//ディレクトリ作成
// val dir = Paths.get("mydir")
val dirp = Paths.get("fileupload", "customer", "profilepics", s"$primarykey")
// if(Files.notExists(dir)) Files.createDirectory(dir) // mkdir
if (Files.notExists(dirp)) Files.createDirectories(dirp) // mkdir -p
picture.ref.moveTo(new File(s"/fileupload/customer/profilepics/$primarykey/$name"))
}
} catch {
case e: Exception => e.printStackTrace()
}
Ok("File uploaded")
}.getOrElse {
Redirect(com.github.j5ik2o.spetstore.application.controller.routes.ProfpicsUploadController.profpicsupload).flashing(
"error" -> "Missing file"
)
}
}
def profpicsupload = Action { implicit request =>
Ok(views.html.profpicsupload(messagesApi.toString, loginForm, profpicsUploadForm))
}
// トップページ
def index = Action { implicit request =>
Ok(views.html.index("Your new application is ready."))
}
}
object ProfpicsUploadController {
def toprofpics(loginForm: LoginCustomer): Unit = {
// val loginName = loginForm.loginName.toString
(
loginForm.email.toString,
loginForm.loginName.toString,
loginForm.password.toString
) match {
case (email, loginName, password) => LoginCustomer(email, loginName, password)
}
}
}