Maison > Article > développement back-end > Comment puis-je écrire dans un fichier en mémoire, puis l'envoyer via HTTP sans utiliser de fichier intermédiaire ?
Je dois demander, traiter et formater des données au format CSV, puis les envoyer via un service Web sur demande.
En supposant que les données demandées et traitées se trouvent data
ci-dessous, j'ai réussi à le faire en utilisant un fichier temporaire intermédiaire :
package main import ( "encoding/csv" "io/ioutil" "net/http" "os" "strconv" "github.com/go-chi/chi/v5" ) type data struct { name string age int } func main() { data := []data{ {"john", 30}, {"jane", 20}, } tempfilename := "temp.csv" // create temporary intermediate file file, err := os.create(tempfilename) defer file.close() if err != nil { panic(err) } w := csv.newwriter(file) var csvdata [][]string for _, record := range data { row := []string{record.name, strconv.itoa(record.age)} csvdata = append(csvdata, row) } w.writeall(csvdata) // read temporary intermediate file to send it via http filebytes, err := ioutil.readfile(tempfilename) if err != nil { panic(err) } // send the file on request router := chi.newrouter() router.get("/data", func(w http.responsewriter, r *http.request) { w.header().set("content-type", "application/octet-stream") w.writeheader(http.statusok) w.write(filebytes) }) http.listenandserve(":8087", router) }
Demande réussie :
PS C:\temp> wget http://localhost:8087/data --2023-06-13 15:34:00-- http://localhost:8087/data Resolving localhost (localhost)... ::1, 127.0.0.1 Connecting to localhost (localhost)|::1|:8087... connected. HTTP request sent, awaiting response... 200 OK Length: 16 [application/octet-stream] Saving to: 'data' data 100%[=================================================>] 16 --.-KB/s in 0s 2023-06-13 15:34:00 (523 KB/s) - 'data' saved [16/16] PS C:\temp> cat data John,30 Jane,20
Jusqu'ici tout va bien - maintenant je veux supprimer les fichiers intermédiaires via
Je ne comprends toujours pas très bien comment utiliser io.*
和bufio.*
pour me connecter en saisissant le type requis :
csv.newwriter()
需要 *os.file
并返回 *csv.writer
*csv.writer
内容需要以某种方式提取为 byte
...http.responsewriter.write()
Quels sont les mécanismes généraux (et les mécanismes spécifiques à ce cas) pour résoudre différents types de problèmes de manipulation de fichiers mémoire ? La
csv.newwriter
采用 io.writer
,因此您可以将 http.responsewriter
lui est transmise sans écrire le contenu dans un fichier ou une mémoire.
Voici la démo :
package main import ( "encoding/csv" "fmt" "net/http" "strconv" "github.com/go-chi/chi/v5" ) type Data struct { Name string Age int } func main() { router := chi.NewRouter() router.Get("/data", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/octet-stream") w.WriteHeader(http.StatusOK) data := []Data{ {"John", 30}, {"Jane", 20}, } csvWriter := csv.NewWriter(w) var csvData [][]string for _, record := range data { row := []string{record.Name, strconv.Itoa(record.Age)} csvData = append(csvData, row) } if err := csvWriter.WriteAll(csvData); err != nil { // handle the error fmt.Println(err) } }) http.ListenAndServe(":8087", router) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!