mirror of
				https://github.com/gitbucket/gitbucket.git
				synced 2025-10-31 10:36:05 +01:00 
			
		
		
		
	Move FileUploadUtil to FileUploadControllerBase.
This commit is contained in:
		| @@ -1,7 +1,7 @@ | |||||||
| package app | package app | ||||||
|  |  | ||||||
| import _root_.util.Directory._ | import _root_.util.Directory._ | ||||||
| import _root_.util.{FileUploadUtil, FileUtil, Validations} | import _root_.util.{FileUtil, Validations} | ||||||
| import org.scalatra._ | import org.scalatra._ | ||||||
| import org.scalatra.json._ | import org.scalatra.json._ | ||||||
| import org.json4s._ | import org.json4s._ | ||||||
| @@ -10,7 +10,8 @@ import org.apache.commons.io.FileUtils | |||||||
| import model.Account | import model.Account | ||||||
| import scala.Some | import scala.Some | ||||||
| import service.AccountService | import service.AccountService | ||||||
| import javax.servlet.http.HttpServletRequest | import javax.servlet.http.{HttpSession, HttpServletRequest} | ||||||
|  | import java.text.SimpleDateFormat | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Provides generic features for controller implementations. |  * Provides generic features for controller implementations. | ||||||
| @@ -116,7 +117,8 @@ case class Context(path: String, loginAccount: Option[Account], currentUrl: Stri | |||||||
| /** | /** | ||||||
|  * Base trait for controllers which manages account information. |  * 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 = { |   protected def updateImage(userName: String, fileId: Option[String], clearImage: Boolean): Unit = { | ||||||
|     if(clearImage){ |     if(clearImage){ | ||||||
| @@ -126,9 +128,9 @@ trait AccountManagementControllerBase extends ControllerBase { self: AccountServ | |||||||
|       } |       } | ||||||
|     } else { |     } else { | ||||||
|       fileId.map { fileId => |       fileId.map { fileId => | ||||||
|         val filename = "avatar." + FileUtil.getExtension(FileUploadUtil.getUploadedFilename(fileId).get) |         val filename = "avatar." + FileUtil.getExtension(getUploadedFilename(fileId).get) | ||||||
|         FileUtils.moveFile( |         FileUtils.moveFile( | ||||||
|           FileUploadUtil.getTemporaryFile(fileId), |           getTemporaryFile(fileId), | ||||||
|           new java.io.File(getUserUploadDir(userName), filename) |           new java.io.File(getUserUploadDir(userName), filename) | ||||||
|         ) |         ) | ||||||
|         updateAvatarImage(userName, Some(filename)) |         updateAvatarImage(userName, Some(filename)) | ||||||
| @@ -149,3 +151,33 @@ trait AccountManagementControllerBase extends ControllerBase { self: AccountServ | |||||||
|   } |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 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 | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -1,6 +1,6 @@ | |||||||
| package app | package app | ||||||
|  |  | ||||||
| import util.{FileUtil, FileUploadUtil} | import util.{FileUtil} | ||||||
| import org.scalatra._ | import org.scalatra._ | ||||||
| import org.scalatra.servlet.{MultipartConfig, FileUploadSupport} | import org.scalatra.servlet.{MultipartConfig, FileUploadSupport} | ||||||
| import org.apache.commons.io.FileUtils | import org.apache.commons.io.FileUtils | ||||||
| @@ -9,17 +9,18 @@ import org.apache.commons.io.FileUtils | |||||||
|  * Provides Ajax based file upload functionality. |  * Provides Ajax based file upload functionality. | ||||||
|  * |  * | ||||||
|  * This servlet saves uploaded file as temporary file and returns the unique id. |  * 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 | ||||||
| class FileUploadController extends ScalatraServlet with FileUploadSupport with FlashMapSupport { |   with FileUploadSupport with FlashMapSupport with FileUploadControllerBase { | ||||||
|  |  | ||||||
|   configureMultipartHandling(MultipartConfig(maxFileSize = Some(3 * 1024 * 1024))) |   configureMultipartHandling(MultipartConfig(maxFileSize = Some(3 * 1024 * 1024))) | ||||||
|  |  | ||||||
|   post("/image"){ |   post("/image"){ | ||||||
|     fileParams.get("file") match { |     fileParams.get("file") match { | ||||||
|       case Some(file) if(FileUtil.isImage(file.name)) => { |       case Some(file) if(FileUtil.isImage(file.name)) => { | ||||||
|         val fileId  = FileUploadUtil.generateFileId |         val fileId  = generateFileId | ||||||
|         FileUtils.writeByteArrayToFile(FileUploadUtil.getTemporaryFile(fileId), file.get) |         FileUtils.writeByteArrayToFile(getTemporaryFile(fileId), file.get) | ||||||
|         session += "upload_" + fileId -> file.name |         session += "upload_" + fileId -> file.name | ||||||
|         Ok(fileId) |         Ok(fileId) | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| package app | package app | ||||||
|  |  | ||||||
| import service._ | import service._ | ||||||
| import util.{FileUploadUtil, FileUtil, AdminAuthenticator} | import util.{FileUtil, AdminAuthenticator} | ||||||
| import util.StringUtil._ | import util.StringUtil._ | ||||||
| import jp.sf.amateras.scalatra.forms._ | import jp.sf.amateras.scalatra.forms._ | ||||||
| import org.apache.commons.io.FileUtils | import org.apache.commons.io.FileUtils | ||||||
|   | |||||||
| @@ -1,17 +1,15 @@ | |||||||
| package servlet | package servlet | ||||||
|  |  | ||||||
| import util.FileUploadUtil |  | ||||||
| import javax.servlet.http.{HttpSessionEvent, HttpSessionListener} | import javax.servlet.http.{HttpSessionEvent, HttpSessionListener} | ||||||
|  | import app.FileUploadControllerBase | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Removes session associated temporary files when session is destroyed. |  * 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 sessionCreated(se: HttpSessionEvent): Unit = {} | ||||||
|  |  | ||||||
|   def sessionDestroyed(se: HttpSessionEvent): Unit = { |   def sessionDestroyed(se: HttpSessionEvent): Unit = removeTemporaryFiles()(se.getSession) | ||||||
|     FileUploadUtil.removeTemporaryFiles()(se.getSession) |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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 |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user