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 ?

Comment puis-je écrire dans un fichier en mémoire, puis l'envoyer via HTTP sans utiliser de fichier intermédiaire ?

王林
王林avant
2024-02-06 11:00:04949parcourir

如何写入内存中的文件,然后通过 HTTP 发送它而不使用中间文件?

Contenu de la question

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

  • Utilisez des "conteneurs" de mémoire pour écrire des données CSV
  • Écrivez son contenu sous forme d'octets sur un rédacteur http

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
  • Ceci *csv.writer 内容需要以某种方式提取为 byte ...
  • ...Afin de fournir 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


La bonne réponse


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer