Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich in eine Datei im Speicher schreiben und sie dann über HTTP senden, ohne eine Zwischendatei zu verwenden?

Wie kann ich in eine Datei im Speicher schreiben und sie dann über HTTP senden, ohne eine Zwischendatei zu verwenden?

王林
王林nach vorne
2024-02-06 11:00:04912Durchsuche

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

Frageninhalt

Ich muss Daten anfordern, verarbeiten und in CSV formatieren und sie dann auf Anfrage über einen Webdienst senden.

Angenommen, die angeforderten und verarbeiteten Daten befinden sich in data unten, ist mir dies mithilfe einer temporären Zwischendatei gelungen:

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)
}

Anfrage erfolgreich:

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

So weit so gut – jetzt möchte ich die Zwischendateien über

löschen
  • Verwenden Sie Speicher-„Container“, um CSV-Daten zu schreiben
  • Schreiben Sie den Inhalt als Bytes an einen http-Writer

Ich verstehe immer noch nicht ganz, wie man io.*bufio.* verwendet, um sich mit dem erforderlichen Typ anzumelden:

  • csv.newwriter() 需要 *os.file 并返回 *csv.writer
  • Das *csv.writer 内容需要以某种方式提取为 byte ...
  • ...Um http.responsewriter.write()
  • bereitzustellen

Was sind die allgemeinen Mechanismen (und die für diesen Fall spezifischen Mechanismen), um verschiedene Arten von Problemen bei der Manipulation von Speicherdateien zu lösen?


Richtige Antwort


csv.newwriter 采用 io.writer,因此您可以将 http.responsewriter wird an ihn übergeben, ohne dass der Inhalt in eine Datei oder einen Speicher geschrieben wird.

Hier ist die Demo:

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)
}

Das obige ist der detaillierte Inhalt vonWie kann ich in eine Datei im Speicher schreiben und sie dann über HTTP senden, ohne eine Zwischendatei zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen