当前位置: 首页 > 面试题库 >

如何从Go服务器在浏览器中下载文件

娄浩荡
2023-03-14
问题内容

我的代码从远程URL获取文件并在浏览器中下载文件:

func Index(w http.ResponseWriter, r *http.Request) {
    url := "http://upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png"

    ...

    resp, err := client.Get(url)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(len(body))
    //download the file in browser

}

func main() {
    http.HandleFunc("/", Index)
    err := http.ListenAndServe(":8000", nil)

    if err != nil {
        fmt.Println(err)
    }
}

代码:http://play.golang.org/p/x-EyR2zFjv

可以获取文件,但是如何在浏览器中下载文件?


问题答案:

要使浏览器打开下载对话框,请在响应中添加Content-DispositionContent-Type标头:

w.Header().Set("Content-Disposition", "attachment; filename=WHATEVER_YOU_WANT")
w.Header().Set("Content-Type", r.Header.Get("Content-Type"))

在将内容发送到客户端之前,请执行此操作。您可能还希望将Content-Length响应的标头复制到客户端,以显示适当的进度。

要将响应主体流传输到客户端而不将其完全加载到内存中(对于大文件,这很重要)-只需将主体读取器复制到响应写入器即可:

io.Copy(w, resp.Body)

io.Copy是一个不错的小功能,它具有读取器接口和写入器接口,可从一个接口读取数据并将其写入另一个接口。这种东西非常有用!

我已经修改了您的代码来执行此操作:http :
//play.golang.org/p/v9IAu2Xu3_



 类似资料:
  • 我有一个基于Spring(Spring Security,Spring控制器和MVC)的项目,所以在我的超文本标记语言页面中,我必须允许文件下载。 我处理事件并使用基于jquery插件的代码 在我的控制器中: 但它在Spring Security性方面有问题,比如这个post x-frame,在internet explorer上不起作用。那么,有没有一种不用插件就能下载存储在我服务器上的文件的方

  • 问题内容: 我每天都有大量的CSV文件要从Yahoo Finance下载。我希望我的应用程序读取文件的创建日期(在我的计算机上,而不是服务器上)。如果创建日期早于今天,则应下载新文件(因为它将具有新数据)。如果不是,则不应该下载新文件,并且相关计算器(本质上就是我的应用程序)应该将上次下载的文件用于特定的股票代码。 我进行了一些谷歌搜索,并找到了Apache POI项目。 这是最好的方法吗?有没有

  • 编辑 当我在模拟器中运行这段代码时,代码仍然不能工作-文件没有下载。

  • 问题内容: 一切正常,但是只有当文件很小(大约1MB)时,当我尝试使用更大的文件(例如20MB)时,我的浏览器将其显示,而不是强制下载,到目前为止,我尝试了许多标头,现在我的代码看起来像: 问题答案: 在将文件内容写入输出流之后,你将设置响应头。在响应生命周期中设置标头很晚。正确的操作顺序应该是首先设置头,然后将文件的内容写入servlet的输出流。 因此,你的方法应编写如下(由于仅是表示形式,因

  • 在下面的onclick事件中,我点击API获取文件路径,然后将该文件路径传递给download方法---- 下载方法为:- 上面的代码我得到错误,因为不创建元素。请帮忙解决这个问题。

  • 问题内容: 我有一个URL,用于保存我的工作中的一些项目,它们大部分是MDB文件,但也有一些JPG和PDF。 我需要做的是列出该目录中的每个文件(已完成)并为用户提供下载它的选项。 使用PHP如何实现? 问题答案: 要读取目录内容,可以使用readdir()并使用脚本(在我的示例中)来下载文件 在其中,您可以强制浏览器发送下载数据,并使用basename()来确保客户端不会传递其他文件名,例如