#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. Спасибо за совет.