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
Release: 2024-02-12 22:57:08
forward
1224 people have browsed it

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()
}
Copy after login

But on the client side I get

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

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
Copy after login

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()
......
Copy after login

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...
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template