2017-06-01 144 views
4

我想添加到我的应用程序一个简单的按钮,点击将调用一个操作,将从两个列表中创建一个csv文件并将其下载到用户计算机。使用Play Framework下载csv文件?

这是我的操作:

def createAndDownloadFile = Action { 

    val file = new File("newFile.csv") 

    val writer = CSVWriter.open(file) 

    writer.writeAll(List(listOfHeaders, listOfValues)) 

    writer.close() 

    Ok.sendFile(file, inline = false, _ => file.getName) 
    } 

但这是现在的工作对我来说,该文件是没有得到从浏览器下载...

IM期待看到该文件得到通过下载浏览器,我想Ok.sendFile应该做的伎俩..

谢谢!

+0

如果您将请求作为Ajax发送,它可能无法按预期工作,请尝试在请求时在单独的窗口中打开。 – mavarazy

+0

@mavarazy我该怎么做? –

+0

链接中的目标应为空白 – mavarazy

回答

-1

您可以使用Enumerators和流。它应该像这样工作:

val enum = Enumerator.fromFile(...) 
val source = akka.stream.scaladsl.Source.fromPublisher(play.api.libs.streams.Streams.enumeratorToPublisher(enum)) 
Result(
    header = ResponseHeader(OK, Map(CONTENT_DISPOSITION → "attachment; filename=whatever.csv.gz")), 
    body = HttpEntity.Streamed(source.via(Compression.gzip), None, None) 
) 

这实际上会通过gzip管道下载。如果不需要,只需删除.via(Compression.gzip)部分。