Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 如何将文件作为zip文件提供服务?_Http_Go_Zip - Fatal编程技术网

Http 如何将文件作为zip文件提供服务?

Http 如何将文件作为zip文件提供服务?,http,go,zip,Http,Go,Zip,我在通过HTTP提供下载文件时遇到问题。使用我当前的代码,我可以轻松下载一个文件 data, err := ioutil.ReadFile("TEST.docx") if err != nil { fmt.Println(err) } log.Fatal(http.ListenAndServe(":3001", http.HandlerFunc(func(rw http.ResponseWriter, r

我在通过HTTP提供下载文件时遇到问题。使用我当前的代码,我可以轻松下载一个文件

    data, err := ioutil.ReadFile("TEST.docx")
    if err != nil {
        fmt.Println(err)
    }

    log.Fatal(http.ListenAndServe(":3001", http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
        rw.Header().Set("Content-Disposition", "attachment; filename=test.docx")
        http.ServeContent(rw, r, "test.docx", time.Now(), bytes.NewReader(data))
    })))
但我希望能够下载一个请求多个文件。大概是这样的:

    data, err := ioutil.ReadFile("test.docx")
    if err != nil {
        fmt.Println(err)
    }

    data2, err := ioutil.ReadFile("test2.docx")
    if err != nil {
        fmt.Println(err)
    }

    log.Fatal(http.ListenAndServe(":3001", http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
        writer := zip.NewWriter(rw)
        create, _ := writer.Create("test.zip")
        _, _ = create.Write(data)
        _, _ = create.Write(data2)
        rw.Header().Set("Content-Disposition", "attachment; filename=test.zip")

        http.ServeContent(rw, r, "test.zip", time.Now(), /*What am I going to put here?*/)

如何将这些文件作为zip文件下载?我做错了什么?

我误解了代码中的一些概念,但我修复了它。现在它起作用了。这是工作代码:

    data, err := ioutil.ReadFile("test.docx")
    if err != nil {
        fmt.Println(err)
    }

    data2, err := ioutil.ReadFile("test2.docx")
    if err != nil {
        fmt.Println(err)
    }

    log.Fatal(http.ListenAndServe(":3001", http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
        buf := new(bytes.Buffer)
        writer := zip.NewWriter(buf)

        test, _ := writer.Create("test.docx")
        _, _ = test.Write(data)
        test2, _ := writer.Create("test2.docx")
        _, _ = test2.Write(data2)
        rw.Header().Set("Content-Disposition", "attachment; filename=test.zip")
        rw.Header().Set("Content-Type", "application/zip")
        _ = writer.Close()

        http.ServeContent(rw, r, "test.zip", time.Now(), bytes.NewReader(buf.Bytes()))
    })))

如果您直接向
响应编写器写入
,请不要同时使用
http.ServeContent
。当我仅使用
buf
时,Goland会给我以下错误:无法将'buf'(type*bytes.Buffer)用作io类型。ReadSeek类型不会实现'io.ReadSeek',因为缺少某些方法:Seek(offset int64,whence int)(int64,error)。这就是我使用这种方式的原因。哦,奇怪的是它不支持这种方式。