我目前正在尝试实现类似的东西,并且我的第一个版本正在运行。我就是这样做的:
在我的控制器中,我定义了一种上传文件的方法。就我而言,我使用 Action.async ,因为我使用reactivemongo将内容保存到我的 MongoDB 中。我已删除该代码,以免使此示例复杂化。
我在这个示例中所做的是上传一个 csv 文件,将其保存到磁盘,然后将第一行作为字符串返回给用户。在现实生活中,该方法会生成一个列表,以便用户能够选择哪一列代表什么等等。
我使用强大的 csv进行 csv 解析。伟大的图书馆!
应用:
def upload = Action.async(parse.multipartFormData) {
implicit request =>
val result = uploadForm.bindFromRequest().fold(
errorForm => Future(BadRequest(views.html.index(errorForm))),
form => {
import java.io.File
request.body.file("csvFile").map {
csv =>
val path = current.configuration.getString("csv.job.new.file.path").getOrElse("")
val name = DateTime.now().getMillis + ".csv"
csv.ref.moveTo(new File(path + name))
val settings = CSVReaderSettings.Standard(linesToSkip = form.linesToSkip)
val rows: Iterator[Array[String]] = CSVReader(path + name)(settings)
val firstRow = rows.next()
val test = firstRow match {
case xs if xs.size == 0 || xs.size == 1 => xs.mkString
case xs if xs.size > 1 => xs.mkString(", ")
}
Future(Ok(test))
}.getOrElse(Future(BadRequest("ahadasda")))
}
)
result
}
路线:
POST /upload @controllers.Application.upload
我在控制器之前使用@,因为我在服务类中使用带有 guice 的 DI。由于我们将使用 javascript 进行上传,因此我们需要定义我们的 jsRoutes:
js路线:
def javascriptRoutes = Action {
implicit request =>
import routes.javascript._
Ok(
Routes.javascriptRouter("jsRoutes")(
Application.upload
)
).as("text/javascript")
}
请记住在要使用路由的模板中导入:
<script type="text/javascript" src="@routes.Application.javascriptRoutes"></script>
<script src="@routes.Assets.at("javascripts/app.js")@Messages("js.version")" type="text/javascript" ></script>
在我的视图模板中,我有一个常规的帮助表单。我做了一些 css 样式的东西来改变上传按钮和文件选择器的外观。但是输入字段在那里。
index.scala.html:
<div class="csvContainer">
@helper.form(action = routes.Application.upload, 'enctype -> "multipart/form-data", 'id -> "csvUpload") {
@Messages("upload.row.skip")
@inputText(uploadForm("linesToSkip"), 'class -> "hidden")
<div style="position:relative;">
<div id="csvFile" style="position:absolute;">
@Messages("upload.choose")
</div>
<input id="uploadFile" type="file" name="csvFile" style="opacity:0; z-index:1;" onchange="document.getElementById('csvFile').innerHTML = this.value;" />
</div>
<p>
<input type="submit" value="@Messages("upload.submit")">
</p>
}
</div>
在app.js中是 ajax 魔法发生的地方,记住我还没有实现任何验证或很酷的 html5 东西,因为进度条和其他处理程序,在 besiors链接中描述。我使用常规的 JQuery。
应用程序.js:
$('#uploadFile').change(function(){
var name = $(this).val().split("\\");
console.log(name[2]);
$('#csvFile').text(name[2]);
});
$('#csvFile').click(function(){
$('#uploadFile').click();
});
$("#csvUpload").submit(function(e) {
e.preventDefault();
var formData = new FormData();
formData.append('csvFile', $( '#uploadFile' )[0].files[0]);
formData.append('linesToSkip', $( "#linesToSkip").val());
jsRoutes.controllers.Application.upload().ajax({
data: formData,
processData: false,
contentType: false,
cache: false,
type: 'POST',
success: function(data){
alert(data);
}
});
});
我删除了很多代码来简化这个例子,我希望我没有忘记任何东西。希望这可以帮助!