Der Inhaltstyp des HTTP-Server-Headers ist auf „multipart/form-data' eingestellt, aber auf der Clientseite wird der Inhaltstyp „Text/Plain' abgerufen

WBOY
Freigeben: 2024-02-12 22:57:08
nach vorne
1185 Leute haben es durchsucht

go http 服务器标头内容类型设置为 multipart/form-data 但在客户端获取 Content-Type: text/plain

In der Webentwicklung ist es häufig notwendig, HTTP-Anfragen zur Übermittlung von Daten zu verwenden. In einigen Fällen müssen wir möglicherweise den angeforderten Inhaltstyp auf „multipart/form-data“ festlegen und auf der Clientseite Daten mit dem Inhaltstyp „text/plain“ abrufen. Solche Einstellungen können in den Headern des HTTP-Servers konfiguriert werden. In PHP können wir dieses Ziel durch entsprechende Funktionen und Methoden erreichen. In diesem Artikel stellt Ihnen der PHP-Editor Xigua vor, wie Sie den Header-Inhaltstyp des HTTP-Servers in PHP auf „multipart/form-data“ festlegen und die Daten mit dem Content-Type „text/plain“ auf dem Client abrufen.

Frageninhalt

Der Go-Server setzt den Header-Inhaltstyp auf „Multipart/Formulardaten“

router.HandleFunc("/certificates", serveFilesHandler).Methods("GET")

func serveFilesHandler(w http.ResponseWriter, r *http.Request) {

    currentDir, err := os.Getwd()
    if err != nil {
        log.Fatal("Can not find the current directory: ", err)
    }
    pathToCertifs := "../certificates"

    // Create a multipart writer for the response
    multipartWriter := multipart.NewWriter(w)

    files := []string{"client.key", "server.key", "rootCA.key"}

    for _, filename := range files {
        filePath := filepath.Join(currentDir, pathToCertifs, filename)

        fmt.Println("see the filePath: ", filePath)

        // Open the file
        file, err := os.Open(filePath)
        if err != nil {}
        defer file.Close()

        // Create a new form file part
        part, err := multipartWriter.CreateFormFile("files", filename)
        if err != nil {}

        // Copy the file content to the part
        _, err = io.Copy(part, file)
        if err != nil {}
    }

    // Set the content type for the response
    w.Header().Set("Content-Type", multipartWriter.FormDataContentType())
    fmt.Println("Content-Type set to:", w.Header().Get("Content-Type"))
    // printout Content-Type set to: multipart/form-data; boundary=7b326

    // Close the multipart writer
    multipartWriter.Close()
}
Nach dem Login kopieren

Aber auf der Kundenseite bekomme ich

Expected multipart response, but received: text/plain; charset=utf-8
Nach dem Login kopieren

Aber die Nutzlast liegt im Körper

body, err := ioutil.ReadAll(resp.Body)
    if err != nil {}
Content-Type: text/plain; charset=utf-8
Response Body:
--aee406774ba6a054d52e39a3cdb72f42d32bd30828adbfb1982d278cab56
Content-Disposition: form-data; name="files"; filename="client.key"
Content-Type: application/octet-stream

-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDNg4ZaTLC/GdLK
xzFDIyPlYyKs/hUXpPkZAQk+3gnvmBaDuMNq2jd2nQoQohmk1zIuD8oj9se5L+3P
Nach dem Login kopieren

Aber ich kann es nicht nach Teilen abrufen, da der Inhaltstyp nicht multipart/form-data ist, also funktioniert das nicht

multipartReader := multipart.NewReader(resp.Body, boundaryFromContentType(contentType))

    // Read each part
    for {
        part, err := multipartReader.NextPart()
        if err != nil {
            break
        }
        defer part.Close()
......
Nach dem Login kopieren

Was habe ich übersehen, danke?

ps: Diese Frage brauchte mehr Details, ich hatte das Gefühl, dass sie klar genug war, also habe ich diese Zeile hinzugefügt, es könnte später funktionieren.

Problemumgehung

HTTP-Antwortheader müssen festgelegt werden, bevor etwas in den Antworttext geschrieben wird. Sobald die Header übermittelt wurden (wenn Sie in den Antworttext schreiben), können Sie die Header nicht mehr festlegen oder ändern.

Sie erstellen den Multipart Writer und alle Teile und Inhalte, legen dann die Antwortheader fest und schließen dann einfach den Multipart Writer. Das Schließen dient nur dazu, die mehrteilige Nachricht zu vervollständigen und die Endgrenze zu schreiben, aber ein Großteil ihres Inhalts wurde möglicherweise bereits geschrieben und festgeschrieben.

Verschieben Sie den Einstellungsheader, bevor Sie etwas zum Multipart Writer hinzufügen/schreiben:

// Create a multipart writer for the response
multipartWriter := multipart.NewWriter(w)

w.Header().Set("Content-Type", multipartWriter.FormDataContentType())

// Now proceed to add files...
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDer Inhaltstyp des HTTP-Server-Headers ist auf „multipart/form-data' eingestellt, aber auf der Clientseite wird der Inhaltstyp „Text/Plain' abgerufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!