首先用Activator
创建一个play
工程,这里就不细说了。工程目录结构如下:
工程创建好了,那么我们做一些准备工作。
首先在工程的public
目录下创建一个uploads
文件夹,用来存放上传的文件。
接下来在app/controllers/Application.scala
中写上传代码。上传采用Form
提交,代码如下:
def upload = Action(parse.multipartFormData) { request =>
request.body.file("picture").map { picture =>
val filename = picture.filename
val contentType = picture.contentType
picture.ref.moveTo(new File(s"public/uploads/$filename"))
//此处是存储在项目根目录下的public目录下,不能以/(如:/public)开头
Ok("File uploaded")
}.getOrElse {
Redirect(routes.Application.index).flashing(
"error" -> "Missing file")
}
}
}
上传代码写好了需要在conf/routes
中配置路由:
POST /upload controllers.Application.upload()
接下来我们可以创建一个用来提交的页面,页面也非常简单,在views
文件夹下创建upload.scala.html
并添加:
<!DOCTYPE html>
<html>
<head>
<title>upload</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
<link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
<script src="@routes.Assets.at("javascripts/hello.js")" type="text/javascript"></script>
</head>
<body>
@helper.form(action = routes.Application.upload, 'enctype -> "multipart/form-data") {
<input type="file" name="picture">
<p>
<input type="submit">
</p>
}
</body>
</html>
到这里上传文件的主要代码就已经完成了。不过我们还需要一个去上传页面的路由:
application.scala
中添加:
def toUpload = Action{
Ok(views.html.upload())
}
routes中添加:
GET /to/upload controllers.Application.toUpload
到这里一个完整的上传功能就已经结束了。接下来我们跑一跑试试:
开发模式运行: activator -> run
浏览器输入:http://127.0.0.1:9000/to/upload
Chrome
中效果图如下:
接着上传一个文件试试:
提交之后:
public/uploads
文件夹下:
已经有了刚才上传的文件了,说明上传文件已经成功了。试了一下不同类型的文件也是可以的。
下载也是很简单。
在写下载之前需要先写一个获取当前下载文件夹下面的文件列表。在Application.scala
中添加:
def getName(path:String,fileNameListBuffer:ListBuffer[String]): Unit = {
val file = Play.getFile(path)
if(file.isDirectory){
val files = file.listFiles()
if(files.nonEmpty){
for(f <- files){
if(f.isDirectory){
getName(f.getAbsolutePath,fileNameListBuffer)
}else{
fileNameListBuffer += f.getName
}
}
}
}
}
然后写下载的方法,Application.scala
中添加:
def download(file_path:String) = Action {
Ok.sendFile(new java.io.File(s"public/uploads/$file_path"))
}
在routes
中添加:
GET /download/:path controllers.Application.download(path:String)
下载页面,views
中创建download.scala.html
并添加:
@(fileList:List[String])
<!DOCTYPE html>
<html>
<head>
<title>upload</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
<link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
<script src="@routes.Assets.at("javascripts/hello.js")" type="text/javascript"></script>
</head>
<body>
@for(item <- fileList) {
<li><a href="@routes.Application.download(item)" >@item</a></li>
}
</body>
</html>
参数是List[String]
类型.
接下来同样添加一个去下载页面的路由,并且指定下载路径,同时运行获取文件列表的getName
方法:
def toDownload = Action{
val path = "public/uploads/"
getName(path,fileNameListBuffer)
Ok(views.html.download(fileNameListBuffer.toList))
}
最后再routes
中添加:
GET /to/download controllers.Application.download
运行效果:
源码https://github.com/xjpz/mosquito-upload