That's exactly what I wanted ! I was missing the `io.Writer` interface. Thanks !
Cheers Rémi On Thursday, August 23, 2018 at 7:00:05 PM UTC+2, Tamás Gulácsi wrote: > > > 2018. augusztus 23., csütörtök 18:39:01 UTC+2 időpontban Remi Ferrand a > következőt írta: >> >> Hi everyone, >> >> This is my first message on this list so please apologize if this >> discussion has already showed up in the past. >> >> What I'm trying to do is quite simple. >> >> I do have a directory with files I want to share to a friend from my >> workstation. >> I would like him to: >> 1. point his web browser to an URL >> 2. be prompted for credentials (basic auth' is ok for my use-case) >> 3. get a prompt to download a TAR archive that contains my workstation's >> directory and files structure. >> >> My question is about the third point. >> >> I do not want the TAR archive to be built on my workstation and then be >> sent over HTTP once the archive contains all the files. >> Sometimes, my workstation does not have enough free disk space to store >> the temporary TAR archive and then send it. >> I would like the TAR archive to be generated on the fly and *streamed >> over HTTP* without any storage on my workstation disk. >> >> I've written a simple code here >> <https://github.com/riton/go-http-tar-dir> that does what I want. >> Everything seems to work. >> >> The code is written in hurry and I've used >> >> exec.Command >> >> to spawn the subprocess "tar cf -". >> I would like to avoid using the external tar util. >> >> I'm just starting in GoLang but I know that there is a package >> *archive/tar* that allows to create TAR archives. >> >> I can't figure out how *archive/tar* can be used in my use case (i.e not >> generating the full TAR archive on my workstation and only then send it >> once the archive is generated). >> >> If someone has already played with the *archive/tar* package and sees >> how I can use it to achieve what I want, any help would be appreciated in >> order to improve my GoLang skills >> >> Thanks ! >> >> Cheers >> >> Rémi >> >> > Just use "tw := tar.NewWriter(w)" where w is your http.ResponseWriter (it > satisfies the io.Writer interface) after you checked everything and have > set w.Header.Set("Content-Type", "application/x-tar"). > Then for each file (use filepath.Walk) tw.WriteHeader(th) (of > tar.FileInfoHeader(fi) of fi := fh.Stat())) then io.Copy(tw, fh): > > tw := tar.NewWriter(w) > filepath.Walk(".", func(path string, info os.FileInfo, err error) error { > if err != nil { > return err > } > th, err := tar.FileInfoHeader(info) > if err != nil { > return err > } > fh, err := os.Open(path) > if err != nil { > return err > } > defer fh.Close() > if err = tw.WriteHeader(th); err != nil { > return err > } > _, err = io.Copy(tw, fh) > return err > }) > > > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.