Как загружать фотографии на стену в vk.com через golang?

Как запостить на странице сообщества сообщение с фотографией? Возникло затруднение с загрузкой фото на сервер вк. URI для загрузки получаю нормально через photos.getWallUploadServer, но когда пытаюсь загрузить, то ничего. Вот код для загрузки:
file, err := os.Open(path)
body := &bytes.Buffer{}
	writer := multipart.NewWriter(body)
	part, err := writer.CreateFormFile("photo", filepath.Base(path))
_, err = io.Copy(part, file)
req, err := http.NewRequest("POST", uri, body) //урл, который я получил
client.Do(req)

Но мне это возвращает
{
"server":624716,
"photo":"[]",
"hash":"170a83ae98131138eabde22ca0b3013f"
}

Просьба объяснить, где я неправ.
P.s. Все права получены.

UPD:
Пока работаю так:
file, err := os.Open(path)
	defer file.Close()

	body := &bytes.Buffer{}
	writer := multipart.NewWriter(body)
	part, err := writer.CreateFormFile(paramName, filepath.Base(path))
	_, err = io.Copy(part, file)
	err = writer.Close()

	resp, _ := http.DefaultClient.Post(uri, writer.FormDataContentType(), body)
	defer resp.Body.Close()
	response_body, err := ioutil.ReadAll(resp.Body)

Но стал больше памяти кушать.
  • Вопрос задан
  • 2080 просмотров
Пригласить эксперта
Ответы на вопрос 1
@alehano
Вот моя функция. Я передаю io.Reader вместо файла, но по сути, такая же у вас.
func postImg(url string, img io.Reader) (server int, photo, hash string, err error) {
	type UploadResponse struct {
		Server int    `json:"server"`
		Photo  string `json:"photo"`
		Hash   string `json:"hash"`
	}

	var b bytes.Buffer
	w := multipart.NewWriter(&b)
	fw, err := w.CreateFormFile("photo", "photo.jpg")
	if err != nil {
		return
	}
	if _, err = io.Copy(fw, img); err != nil {
		return
	}
	w.Close()

	req, err := http.NewRequest("POST", url, &b)
	if err != nil {
		return
	}
	req.Header.Set("Content-Type", w.FormDataContentType())

	// Submit the request
	client := &http.Client{}
	res, err := client.Do(req)
	if err != nil {
		return
	}

	// resp
	uplRes := UploadResponse{}
	dec := json.NewDecoder(res.Body)
	err = dec.Decode(&uplRes)
	if err != nil {
		return
	}
	defer res.Body.Close()

	server = uplRes.Server
	photo = uplRes.Photo
	hash = uplRes.Hash
	return
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы