首頁 > 後端開發 > Golang > go http 伺服器標頭內容類型設定為 multipart/form-data 但在客戶端取得 Content-Type: text/plain

go http 伺服器標頭內容類型設定為 multipart/form-data 但在客戶端取得 Content-Type: text/plain

WBOY
發布: 2024-02-12 22:57:08
轉載
1226 人瀏覽過

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

在進行網頁開發中,經常需要使用 HTTP 請求來傳輸資料。在某些情況下,我們可能需要將請求的內容類型設定為 multipart/form-data,並在客戶端取得 Content-Type 為 text/plain 的資料。這樣的設定可以透過在 HTTP 伺服器的標頭中進行設定來實現。在 PHP 中,我們可以透過對應的函數和方法來實現這個目標。在本文中,php小編西瓜將為您介紹如何在 PHP 中設定 HTTP 伺服器的標頭內容類型為 multipart/form-data,並在客戶端取得 Content-Type 為 text/plain 的資料。

問題內容

Go 伺服器將 header Content-type 設為 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()
}
登入後複製

但是在客戶端我得到了

Expected multipart response, but received: text/plain; charset=utf-8
登入後複製

但是有效負載位於主體中

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
登入後複製

但我無法按部分獲取它,因為內容類型不是 multipart/form-data,所以這不起作用

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

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

我缺少什麼,謝謝?

ps:這個問題需要更多細節,我覺得已經很清楚了,所以我添加了這一行,之後可能會起作用。

解決方法

在將任何內容寫入回應正文之前,必須設定 HTTP 回應標頭。一旦提交了標頭(當您寫入內容到回應正文時),您就無法設定或變更標頭。

您建立多部分編寫器以及所有部分和內容,然後設定回應標頭,然後僅關閉多部分編寫器。關閉只是為了完成多部分訊息並寫入尾部邊界,但其許多內容可能已經被寫入並提交。

在向多部分編寫器新增/寫入任何內容之前移動設定標頭:

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

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

// Now proceed to add files...
登入後複製

以上是go http 伺服器標頭內容類型設定為 multipart/form-data 但在客戶端取得 Content-Type: text/plain的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板