如何在Go中设置或恢复响应体中的文件头?

mefy6pfw  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(100)

我有一些文件头,通过GET请求的响应发送,以被压缩的恢复问题。这里的主要问题是我想摆脱Go为文件设置的默认日期“11月30日,1979”(一旦文件被压缩),而不是现在的日期。但是,我不知道如何修改,甚至不知道如何从文件中检索头文件,因为我从响应体接收到的是一个io.ReadCloser类型。
下面是当前代码

archive := zip.NewWriter(w)
            attachment := "attachment; filename=someZipFile.zip")
            c.Writer.Header().Set("Content-Disposition", attachment)

            for i := 0; i < len(bodies); i++ { // bodies are response bodies, corresponding to "downloaded" files
                defer bodies[i].Close()
                fmt.Println(filenames[i])

                w, err := archive.Create("someZipFile/" + filenames[i])
                if err != nil {
                    fmt.Println("File couldn't be created")
                    return true
                }

                if _, err := io.Copy(w, bodies[i]); err != nil {
                    fmt.Println("File couldn't be written")
                    return true
                }

            }
            archive.Close()

我想澄清我能做什么,是否创建一个新的头或编辑现有的,如果前者,如何获得文件头。在最坏的情况下,找出一个全新的解决方案。

9vw9lbht

9vw9lbht1#

Create是一个调用CreateHeader的helper方法。直接调用文件头指定文件元数据:

w, err := archive.CreateHeader(&zip.FileHeader{
        Name:     "someZipFile/" + filenames[i],
        Method:   zip.Deflate,
        Modified: time.Now(),
    })

更改调用以创建存档文件,如下所示。请按原样使用问题中的其他代码。

2w2cym1i

2w2cym1i2#

感谢@eagergopher的回复,我能够构建一个适当的解决方案
这是结果

archive := zip.NewWriter(w)
            attachment := "attachment; filename=someZipFile.zip")
            c.Writer.Header().Set("Content-Disposition", attachment)

            for i := 0; i < len(bodies); i++ { // bodies are response bodies,corresponding to "downloaded" files
                defer bodies[i].Close()
                fmt.Println(filenames[i])}

                w, err := archive.CreateHeader(&zip.FileHeader{
                Name:     filenames[i],
                Method:   zip.Deflate,
                Modified: time.Now(),
                })

                if err != nil {
                  fmt.Println("Header couldn't be created")
                  return true
                }

                if _, err := io.Copy(w, bodies[i]); err != nil {
                    fmt.Println("File couldn't be written")
                    return true
                }

            }
            archive.Close()
            return false
})

相关问题