将音频/视频文件传递给API

huangapple go评论130阅读模式
英文:

Passing Audio/ Video File to API

问题

我正在尝试使用Soundcloud API(https://developers.soundcloud.com/docs/api/reference#tracks)将音频文件上传到Soundcloud。我必须传递文件的参数需要"音频文件的二进制数据",但我不确定如何在Go中加载这样的数据。

我的当前代码如下,但是音频文件当然无法正确发送。

  1. buf := new(bytes.Buffer)
  2. w := multipart.NewWriter(buf)
  3. label, err := w.CreateFormField("oauth_token")
  4. if err != nil {
  5. return err
  6. }
  7. label.Write([]byte(c.Token.AccessToken))
  8. fw, err := w.CreateFormFile("upload", "platform/young.mp3")
  9. if err != nil {
  10. return err
  11. }
  12. fd, err := os.Open("platform/young.mp3")
  13. if err != nil {
  14. return err
  15. }
  16. defer fd.Close()
  17. _, err = io.Copy(fw, fd)
  18. if err != nil {
  19. return err
  20. }
  21. w.Close()
  22. req, err := http.NewRequest("POST", "https://api.soundcloud.com/tracks.json", buf)
  23. if err != nil {
  24. return err
  25. }
  26. req.Header.Set("Content-Type", w.FormDataContentType())
  27. req.SetBasicAuth("email@email.com", "password")
  28. fmt.Println(req.Form)
  29. res, err := c.Client.Do(req)
  30. if err != nil {
  31. return err
  32. }
英文:

I'm trying to use the Soundcloud API (https://developers.soundcloud.com/docs/api/reference#tracks) to upload an audio file to Soundcloud. The parameter I must pass the file in requires "binary data of the audio file" and I'm unsure how to load such a thing in Go.

My current code is as follows, but the audio file of course does not send properly.

  1. buf := new(bytes.Buffer)
  2. w := multipart.NewWriter(buf)
  3. label, err := w.CreateFormField("oauth_token")
  4. if err != nil {
  5. return err
  6. }
  7. label.Write([]byte(c.Token.AccessToken))
  8. fw, err := w.CreateFormFile("upload", "platform/young.mp3")
  9. if err != nil {
  10. return err
  11. }
  12. fd, err := os.Open("platform/young.mp3")
  13. if err != nil {
  14. return err
  15. }
  16. defer fd.Close()
  17. _, err = io.Copy(fw, fd)
  18. if err != nil {
  19. return err
  20. }
  21. w.Close()
  22. req, err := http.NewRequest("POST", "https://api.soundcloud.com/tracks.json", buf)
  23. if err != nil {
  24. return err
  25. }
  26. req.Header.Set("Content-Type", w.FormDataContentType())
  27. req.SetBasicAuth("email@email.com", "password")
  28. fmt.Println(req.Form)
  29. res, err := c.Client.Do(req)
  30. if err != nil {
  31. return err
  32. }

答案1

得分: 1

我还没有测试下面的代码,因为我没有有效的Oauth令牌,但它可能会帮助你找到正确的方向。

  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "log"
  7. "mime/multipart"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. )
  12. func main() {
  13. uri := "https://api.soundcloud.com/tracks.json"
  14. params := map[string]string{
  15. "oauth_token": "************",
  16. "track[title]": "Test Track",
  17. "track[sharing]": "public",
  18. }
  19. trackData := "track[asset_data]"
  20. path := "test_track.mp3"
  21. file, err := os.Open(path)
  22. if err != nil {
  23. log.Fatal(err)
  24. }
  25. defer file.Close()
  26. body := &bytes.Buffer{}
  27. writer := multipart.NewWriter(body)
  28. part, err := writer.CreateFormFile(trackData, filepath.Base(path))
  29. if err != nil {
  30. log.Fatal(err)
  31. }
  32. _, err = io.Copy(part, file)
  33. for key, val := range params {
  34. err := writer.WriteField(key, val)
  35. if err != nil {
  36. log.Fatal(err)
  37. }
  38. }
  39. err = writer.Close()
  40. if err != nil {
  41. log.Fatal(err)
  42. }
  43. request, err := http.NewRequest("POST", uri, body)
  44. if err != nil {
  45. log.Fatal(err)
  46. }
  47. request.Header.Set("Content-Type", writer.FormDataContentType())
  48. client := &http.Client{}
  49. resp, err := client.Do(request)
  50. if err != nil {
  51. log.Fatal(err)
  52. } else {
  53. body := &bytes.Buffer{}
  54. _, err := body.ReadFrom(resp.Body)
  55. if err != nil {
  56. log.Fatal(err)
  57. }
  58. resp.Body.Close()
  59. fmt.Println(resp.StatusCode)
  60. fmt.Println(resp.Header)
  61. fmt.Println(body)
  62. }
  63. }

希望对你有帮助!

英文:

I haven't tested the code below, as I don't have a valid Oauth token, but it may put you on the right track.

  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "log"
  7. "mime/multipart"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. )
  12. func main() {
  13. uri := "https://api.soundcloud.com/tracks.json"
  14. params := map[string]string{
  15. "oauth_token": "************",
  16. "track[title]": "Test Track",
  17. "track[sharing]": "public",
  18. }
  19. trackData := "track[asset_data]"
  20. path := "test_track.mp3"
  21. file, err := os.Open(path)
  22. if err != nil {
  23. log.Fatal(err)
  24. }
  25. defer file.Close()
  26. body := &bytes.Buffer{}
  27. writer := multipart.NewWriter(body)
  28. part, err := writer.CreateFormFile(trackData, filepath.Base(path))
  29. if err != nil {
  30. log.Fatal(err)
  31. }
  32. _, err = io.Copy(part, file)
  33. for key, val := range params {
  34. err := writer.WriteField(key, val)
  35. if err != nil {
  36. log.Fatal(err)
  37. }
  38. }
  39. err = writer.Close()
  40. if err != nil {
  41. log.Fatal(err)
  42. }
  43. request, err := http.NewRequest("POST", uri, body)
  44. if err != nil {
  45. log.Fatal(err)
  46. }
  47. request.Header.Set("Content-Type", writer.FormDataContentType())
  48. client := &http.Client{}
  49. resp, err := client.Do(request)
  50. if err != nil {
  51. log.Fatal(err)
  52. } else {
  53. body := &bytes.Buffer{}
  54. _, err := body.ReadFrom(resp.Body)
  55. if err != nil {
  56. log.Fatal(err)
  57. }
  58. resp.Body.Close()
  59. fmt.Println(resp.StatusCode)
  60. fmt.Println(resp.Header)
  61. fmt.Println(body)
  62. }
  63. }

huangapple
  • 本文由 发表于 2014年8月11日 05:00:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/25232984.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定