mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-03 03:55:58 +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