在play框架scala中限制率下载的最佳方式

时间:2012-01-16 02:35:46

标签: scala streaming playframework binaryfiles

问题:限制二进制文件下载速率。

    def test = {
      Logger.info("Call test action")

      val file = new File("/home/vidok/1.jpg")
      val fileIn = new FileInputStream(file)

      response.setHeader("Content-type", "application/force-download")
      response.setHeader("Content-Disposition", "attachment; filename=\"1.jpg\"")
      response.setHeader("Content-Length", file.lenght + "")

      val bufferSize = 1024 * 1024
      val bb = new Array[Byte](bufferSize)
      val bis = new java.io.BufferedInputStream(is)
      var bytesRead = bis.read(bb, 0, bufferSize)
      while (bytesRead > 0) {
        bytesRead = bis.read(bb, 0, bufferSize)
        //sleep(1000)?
        response.writeChunk(bytesRead)
      }
    }

但它只适用于文本文件。如何使用二进制文件?

2 个答案:

答案 0 :(得分:2)

你的基本想法是正确的:每次你读取一定数量的字节(存储在你的缓冲区中),你需要:

  1. 评估您的阅读速度(= X B / ms)
  2. 计算X与读取的速度之间的差异(= Y ms)
  3. 如果需要降低下载速率,请在下载线程上使用sleep(Y)
  4. 关于这个right here已经有了一个很好的问题,它应该包含你需要的一切。我认为特别是ThrottledInputStream解决方案(这不是公认的答案)相当优雅。

    要记住几点:

    • 使用1个线程下载所有内容是最简单的方法,但如果您想继续提供请求,它也是效率最低的方式。
    • 通常,您至少需要将文件的实际下载卸载到自己的单独帖子中。
    • 要加快速度:考虑以块(使用HTTP Content-Range)和Java NIO下载文件。但是,请记住,这会使事情变得更加复杂。

答案 1 :(得分:0)

我不会实现任何好的网络服务器应该能够为我提供的东西。在企业系统中,这种事情通常由Web入口服务器或防火墙处理。但如果你必须这样做,那么tmbrggmn的回答对我来说很好。 NIO是一个很好的提示。