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.
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.
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!