首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将csv文件作为akka http响应发送?

如何将csv文件作为akka http响应发送?
EN

Stack Overflow用户
提问于 2019-06-07 14:25:45
回答 2查看 1.2K关注 0票数 2

我有一个要求,从数据库中获取数据,并创建CSV文件的数据,并返回它,该文件应下载。并在发送响应后从服务器中删除。我使用了这个Simple CSV streaming example

代码片段:

代码语言:javascript
运行
复制
def getAllRetailersCsvData: Route =
post {
  entity(As[String]) { body =>

  //removed database calls and added data from db 
  val retailersInformation = RetailersInformation(
                              List(
                              RetailerInformation(Target,277,8360.56,267.12),
                              RetailerInformation(Amazon,85,1370.0,540.11),
                              RetailerInformation(Walmart,77,1431.32,344.38),
                              RetailerInformation(Best buy,63,1213.22,160.84),
                              RetailerInformation(Others,22,391.77,108.1),
                              RetailerInformation(Others,17,317.86,157.93),
                              RetailerInformation(Ebay,4,46.97,14.55),
                              RetailerInformation(Big lots,3,24.0,12.33),
                              RetailerInformation(Smith's,2,44.98,218.43),
                              RetailerInformation(Kroger,2,39.98,29.09)),23)


  implicit val retailerAsCsv = Marshaller.strict[RetailersInformation, ByteString] { t =>
  Marshalling.WithFixedContentType(ContentTypes.`text/csv(UTF-8)`, () => {
  ByteString(t.retailersInformation.map(r => csvData(r)).mkString("\n"))
})
}

  implicit val csvStreaming: CsvEntityStreamingSupport = EntityStreamingSupport.csv()

  val eventualRetailersInfo = Future(retailersInformation)
  onComplete(eventualRetailersInfo) {

  case Success(info: RetailersInformation) =>
  complete(Source.single(info))
  case Failure(exception) =>
  logger.error(s"Got an exception when getting all retailers info by $campaignId , exception $exception")
  complete(HttpResponse(InternalServerError, entity = generate(ErrorResponse(ErrorMessage))))
}
}
}

问题是,当我点击邮递员的路线,我得到了正确的内容,但不是csv文件。

输出:

代码语言:javascript
运行
复制
Retailer Name,Receipts Submitted,Brand Total,Basket Size
"Target","277","267.12","8360.56"
"Amazon","85","540.11","1370.0"
"Walmart","77","344.38","1431.32"
"Best buy","63","160.84","1213.22"
"Others","22","108.1","391.77"
"Others","17","157.93","317.86"
"Ebay","4","14.55","46.97"
"Big lots","3","12.33","24.0"
"Smith's","2","218.43","44.98"
"Kroger","2","29.09","39.98"

我有一些与流式csv示例不同的东西。我有一个post请求。不确定在何处设置仅接受csv文本的标头。如果我正在制作accept,请指导我,因为我是Akka流概念的初学者。任何帮助都将不胜感激。

谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2019-06-11 23:54:50

要解决此问题,首先我创建一个文件作为HTTP响应进行传递。

代码语言:javascript
运行
复制
def writeToFile(content: String, campaignId: String): File = {
    val tempFolder = System.getProperty(TempDir)
    val file = new File(s"$tempFolder/retailers_$campaignId.csv")
    val bw = new BufferedWriter(new FileWriter(file))
    bw.write(content)
    bw.close()
    file
  }

def retailersInfoForCsvResponseHandler(response: Either[Throwable, Option[String]], campaignId: String): HttpResponse =
    response.fold({ err =>
      logger.error(s"An exception has occurred while getting retailersInfo for csv from snap3 service ${err.getMessage}")
      HttpResponse(StatusCodes.InternalServerError, entity = err.getMessage)
    }, response => {
      val file = writeToFile(response.fold("")(identity), campaignId)
      val source = FileIO.fromPath(file.toPath)
        .watchTermination() { case (_, result) =>
          result.onComplete(_ => file.delete())
        }

      HttpResponse(status = StatusCodes.OK, entity = HttpEntity(ContentTypes.`text/csv(UTF-8)`, source))
    })

这对我很管用。并且文件作为响应被发送,并且文件在响应被发送之后被删除。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56488983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档