Home >Backend Development >Golang >go http server header content-type is set to multipart/form-data but on client side getting Content-Type: text/plain

go http server header content-type is set to multipart/form-data but on client side getting Content-Type: text/plain

WBOY
WBOYforward
2024-02-12 22:57:081202browse

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

In network development, it is often necessary to use HTTP requests to transmit data. In some cases, we may need to set the requested content-type to multipart/form-data and get data with a Content-Type of text/plain on the client side. Such settings can be configured in the headers of the HTTP server. In PHP, we can achieve this goal through corresponding functions and methods. In this article, PHP editor Xigua will introduce to you how to set the header content type of the HTTP server to multipart/form-data in PHP, and obtain the data with Content-Type of text/plain on the client.

Question content

Go server sets header Content-type to multipart/form-data

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

But on the client side I get

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

But the payload is in the body

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

But I can't get it by part because the content type is not multipart/form-data so this doesn't work

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

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

What am I missing, thank you?

ps: This question needed more details, I felt it was clear enough, so I added this line, it might work later.

Workaround

HTTP response headers must be set before anything is written to the response body. Once the headers are submitted (when you write to the response body), you cannot set or change the headers.

You create the multipart writer and all parts and content, then set the response headers, then just close the multipart writer. Closing is just to complete the multipart message and write the tail boundary, but much of its contents may have already been written and committed.

Move the settings header before adding/writing anything to the multipart writer:

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

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

// Now proceed to add files...

The above is the detailed content of go http server header content-type is set to multipart/form-data but on client side getting Content-Type: text/plain. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete