【问题标题】:Go huge file download and passing to client (proxifying)去大文件下载并传递给客户端(代理)
【发布时间】:2014-03-09 14:36:32
【问题描述】:

我有一个基于 Martini 的小型应用程序,但遇到了一个我无法解决的问题。

我想添加一个应用程序功能,允许用户从第三台服务器获取文件,并对 HTTP 标头进行一些更改。某种代理。这些文件非常大(每个 200+Mb),我希望将这些文件“流式传输”到客户端。 “流”是指文件数据应该在应用程序接收到第一个字节后立即开始返回到客户端,而不会将整个文件保存在磁盘和/或内存中。

Martini 和 Go 可以做到这一点吗?

【问题讨论】:

  • 退伍军人对这些“简单”框架的问题如此沮丧的原因之一就是这样的问题。如果您不使用马提尼酒,这很简单明了。事实上,支持范围请求、条件获取、压缩协商等……几乎不需要您付出任何努力。作为观察者,这些框架似乎只会让事情变得更难,效率更低。
  • @Dustin 这通常是正确的,但仍然缺少一些东西。以大猩猩为例。他们添加了自动模式解析。这非常有用。我个人已经扩展它以添加输入验证(他们不希望它作为 gorilla.schema 的一部分,我需要它),但我喜欢 Gorilla 的地方在于您只需稍微扩展标准 http 库 - 只是一样多根据需要。
  • gorilla 不是一个框架,而是一些在您需要时添加功能的软件包。

标签: go martini


【解决方案1】:

是的,一般来说 Go 是可能的,我对 Martini 不是特别熟悉。调用远程文件的 http 响应返回一个Reader 接口,并且您的请求处理程序有一个Writer 接口。这意味着您可以读取数据流并写入数据流。让您只负责操作您想要的内容,并将转发的流“修补”到请求流。

Go 甚至在标准库中内置了一个 ReverseProxy 实用程序:

http://golang.org/pkg/net/http/httputil/#ReverseProxy

如果需要,您可以混合使用 Martini 和标准 http 库。

[编辑] 阅读 martini 文档,您可以像标准库一样添加原始 http 处理程序,这意味着您确实可以这样做:https://github.com/codegangsta/martini#service-injection

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 2018-04-29
    • 2020-04-16
    • 2019-12-07
    • 2013-06-26
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多