Похоже, я не могу использовать CreateFormFile и CreateFormField для создания нового запроса

#http #go

# #http #Вперед

Вопрос:

Я пытаюсь создать запрос с помощью multipart.CreateFormFile и multipart .CreateFormField, но у меня не получается передать данные по назначению.

Я хочу отправить сообщение формы клиенту, и клиент выполнит некоторую предварительную обработку данных, а затем отправит их в конечный пункт назначения на сервере. Следует отметить, что у меня возникают проблемы только при передаче файла, обычное приложение / x-www-form-urlencoded, я могу заставить его работать нормально.

Итак, вот мой сценарий. Кто-то отправляет форму с файлом в /post, маршрут /post затем принимает данные формы и использует multipart .CreateFormFile и multipart .CreateFormField для создания нового http.newRequest .

Вот мой код:

     http.HandleFunc("/post", func(w http.ResponseWriter, r *http.Request){

        r.ParseMultipartForm(10 << 20)

        file, header, _ := r.FormFile("file")
        
        b := bytes.Buffer{}
        we := multipart.NewWriter(amp;b)

        var fw io.Writer
        
        defer we.Close()
        
        fw, err := we.CreateFormFile("file", header.Filename) //create the new file field 

        _, err = io.Copy(fw, file) //copy the file to the new file field
        
        if err != nil {
            fmt.Println("error with copy")
        }

        for key, r0 := range r.Form { //this creates and copies the form values to the new created form
            if fw, err = we.CreateFormField(key); err != nil {
                return
            }

            _, err = io.Copy(fw, strings.NewReader(r0[0])) //copies field data to new form field

            if err != nil {
                fmt.Println("error with copy fields")
            }           
        }

        req, err := http.NewRequest("POST", "http://localhost:3000/newpost", amp;b) //make new request from buffer

        CheckError(err, "error with post form req")
        req.Header.Set("Content-Type", we.FormDataContentType()) //set content type

        resp, err := http.DefaultClient.Do(req) //send request and get response

        CheckError(err, "error with post form resp")

        fmt.Println(resp.StatusCode)
    })  
 

Это ставит меня в тупик, потому что я нахожу минимальное объяснение того, чего я пытаюсь достичь, или я упускаю что-то фундаментальное.

Итак, вкратце, я хочу создать новую форму с файлом для отправки в http.NewRequest через POST. Если я перейду в http.Запрос.Форма для нового запроса отправляет только значения формы, а не файл формы.

Комментарии:

1. Вызовите we.Close() перед созданием нового запроса. Отложенный вызов we . Close() выполняется после выполнения запроса. Это не проблема, но вы можете упростить код для записи полей, вызвав we.WriteField(ключ, r0[0]) .

2. вау, спасибо, что указали на это. Я не могу поверить, что это было что-то настолько простое, что я пропустил, что я бился головой о стену, пытаясь понять это! Я ценю это, похоже, он работает так, как я хотел. Я также упростил с помощью WriteField. Спасибо за совет.