Maison > développement back-end > Golang > 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 ?

王林
Libérer: 2024-02-06 11:00:04
avant
954 Les gens l'ont consulté

如何写入内存中的文件,然后通过 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)
}
Copier après la connexion

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
Copier après la connexion

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)
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal