diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index b338f36..92396b7 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -1,7 +1,7 @@ package app import _root_.util.Directory._ -import _root_.util.{FileUploadUtil, FileUtil, Validations} +import _root_.util.{FileUtil, Validations} import org.scalatra._ import org.scalatra.json._ import org.json4s._ @@ -10,7 +10,8 @@ import model.Account import scala.Some import service.AccountService -import javax.servlet.http.HttpServletRequest +import javax.servlet.http.{HttpSession, HttpServletRequest} +import java.text.SimpleDateFormat /** * Provides generic features for controller implementations. @@ -116,7 +117,8 @@ /** * Base trait for controllers which manages account information. */ -trait AccountManagementControllerBase extends ControllerBase { self: AccountService => +trait AccountManagementControllerBase extends ControllerBase with FileUploadControllerBase { + self: AccountService => protected def updateImage(userName: String, fileId: Option[String], clearImage: Boolean): Unit = { if(clearImage){ @@ -126,9 +128,9 @@ } } else { fileId.map { fileId => - val filename = "avatar." + FileUtil.getExtension(FileUploadUtil.getUploadedFilename(fileId).get) + val filename = "avatar." + FileUtil.getExtension(getUploadedFilename(fileId).get) FileUtils.moveFile( - FileUploadUtil.getTemporaryFile(fileId), + getTemporaryFile(fileId), new java.io.File(getUserUploadDir(userName), filename) ) updateAvatarImage(userName, Some(filename)) @@ -148,4 +150,34 @@ .map { _ => "Mail address is already registered." } } +} + +/** + * Base trait for controllers which needs file uploading feature. + */ +trait FileUploadControllerBase { + + def generateFileId: String = + new SimpleDateFormat("yyyyMMddHHmmSSsss").format(new java.util.Date(System.currentTimeMillis)) + + def TemporaryDir(implicit session: HttpSession): java.io.File = + new java.io.File(GitBucketHome, s"tmp/_upload/${session.getId}") + + def getTemporaryFile(fileId: String)(implicit session: HttpSession): java.io.File = + new java.io.File(TemporaryDir, fileId) + + // def removeTemporaryFile(fileId: String)(implicit session: HttpSession): Unit = + // getTemporaryFile(fileId).delete() + + def removeTemporaryFiles()(implicit session: HttpSession): Unit = + FileUtils.deleteDirectory(TemporaryDir) + + def getUploadedFilename(fileId: String)(implicit session: HttpSession): Option[String] = { + val filename = Option(session.getAttribute("upload_" + fileId).asInstanceOf[String]) + if(filename.isDefined){ + session.removeAttribute("upload_" + fileId) + } + filename + } + } \ No newline at end of file diff --git a/src/main/scala/app/FileUploadController.scala b/src/main/scala/app/FileUploadController.scala index 5d5ed3b..350dfed 100644 --- a/src/main/scala/app/FileUploadController.scala +++ b/src/main/scala/app/FileUploadController.scala @@ -1,6 +1,6 @@ package app -import util.{FileUtil, FileUploadUtil} +import util.{FileUtil} import org.scalatra._ import org.scalatra.servlet.{MultipartConfig, FileUploadSupport} import org.apache.commons.io.FileUtils @@ -9,17 +9,18 @@ * Provides Ajax based file upload functionality. * * This servlet saves uploaded file as temporary file and returns the unique id. - * You can get uploaded file using [[util.FileUploadUtil#getTemporaryFile()]] with this id. + * You can get uploaded file using [[app.FileUploadControllerBase#getTemporaryFile()]] with this id. */ -// TODO Remove temporary files at session timeout by session listener. -class FileUploadController extends ScalatraServlet with FileUploadSupport with FlashMapSupport { +class FileUploadController extends ScalatraServlet + with FileUploadSupport with FlashMapSupport with FileUploadControllerBase { + configureMultipartHandling(MultipartConfig(maxFileSize = Some(3 * 1024 * 1024))) post("/image"){ fileParams.get("file") match { case Some(file) if(FileUtil.isImage(file.name)) => { - val fileId = FileUploadUtil.generateFileId - FileUtils.writeByteArrayToFile(FileUploadUtil.getTemporaryFile(fileId), file.get) + val fileId = generateFileId + FileUtils.writeByteArrayToFile(getTemporaryFile(fileId), file.get) session += "upload_" + fileId -> file.name Ok(fileId) } diff --git a/src/main/scala/app/UserManagementController.scala b/src/main/scala/app/UserManagementController.scala index e5673d4..66a6692 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -1,7 +1,7 @@ package app import service._ -import util.{FileUploadUtil, FileUtil, AdminAuthenticator} +import util.{FileUtil, AdminAuthenticator} import util.StringUtil._ import jp.sf.amateras.scalatra.forms._ import org.apache.commons.io.FileUtils diff --git a/src/main/scala/servlet/SessionCleanupListener.scala b/src/main/scala/servlet/SessionCleanupListener.scala index 86c8bcc..87ce1d1 100644 --- a/src/main/scala/servlet/SessionCleanupListener.scala +++ b/src/main/scala/servlet/SessionCleanupListener.scala @@ -1,17 +1,15 @@ package servlet -import util.FileUploadUtil import javax.servlet.http.{HttpSessionEvent, HttpSessionListener} +import app.FileUploadControllerBase /** * Removes session associated temporary files when session is destroyed. */ -class SessionCleanupListener extends HttpSessionListener { +class SessionCleanupListener extends HttpSessionListener with FileUploadControllerBase { def sessionCreated(se: HttpSessionEvent): Unit = {} - def sessionDestroyed(se: HttpSessionEvent): Unit = { - FileUploadUtil.removeTemporaryFiles()(se.getSession) - } + def sessionDestroyed(se: HttpSessionEvent): Unit = removeTemporaryFiles()(se.getSession) } diff --git a/src/main/scala/util/FileUploadUtil.scala b/src/main/scala/util/FileUploadUtil.scala deleted file mode 100644 index 6efacc1..0000000 --- a/src/main/scala/util/FileUploadUtil.scala +++ /dev/null @@ -1,33 +0,0 @@ -package util - -import java.text.SimpleDateFormat -import javax.servlet.http.HttpSession -import util.Directory._ -import org.apache.commons.io.FileUtils - -object FileUploadUtil { - - def generateFileId: String = - new SimpleDateFormat("yyyyMMddHHmmSSsss").format(new java.util.Date(System.currentTimeMillis)) - - def TemporaryDir(implicit session: HttpSession): java.io.File = - new java.io.File(GitBucketHome, s"tmp/_upload/${session.getId}") - - def getTemporaryFile(fileId: String)(implicit session: HttpSession): java.io.File = - new java.io.File(TemporaryDir, fileId) - -// def removeTemporaryFile(fileId: String)(implicit session: HttpSession): Unit = -// getTemporaryFile(fileId).delete() - - def removeTemporaryFiles()(implicit session: HttpSession): Unit = - FileUtils.deleteDirectory(TemporaryDir) - - def getUploadedFilename(fileId: String)(implicit session: HttpSession): Option[String] = { - val filename = Option(session.getAttribute("upload_" + fileId).asInstanceOf[String]) - if(filename.isDefined){ - session.removeAttribute("upload_" + fileId) - } - filename - } - -}