この章では、Go Restyライブラリを使用したファイルのアップロードとダウンロードの方法について紹介します。

マルチパートファイルのアップロード

マルチパートPOSTリクエストを使用してファイルをアップロードする

// まず2つのファイルを読み込む
profileImgBytes、_ := os.ReadFile("/Users/jeeva/test-img.png")
notesBytes、_ := os.ReadFile("/Users/jeeva/text-file.txt")

// Restyクライアントの作成
client := resty.New()

// SetFileReaderを使用してファイルとパラメータを自動的に設定してアップロードする
// 他のフォームパラメータを設定するにはSetFormDataを使用する
resp、err := client.R().
      SetFileReader("profile_img", "test-img.png", bytes.NewReader(profileImgBytes)).
      SetFileReader("notes", "text-file.txt", bytes.NewReader(notesBytes)).
      SetFormData(map[string]string{
          "first_name": "Jeevanandam",
          "last_name": "M",
      }).
      Post("http://www.tizi365.com/upload")

直接ローカルファイルをアップロード

これは、ファイルを最初に読み込む必要なく、直接ローカルファイルをアップロードできるため、上記よりも便利です。

// Restyクライアントの作成
client := resty.New()

// SetFileを使用してファイルをアップロードし、バインドされたリクエストパラメータフィールドを設定する
resp、err := client.R().
      SetFile("profile_img", "/Users/jeeva/test-img.png").
      Post("http://myapp.com/upload")

// SetFilesを使用して複数のファイルを一括アップロードする
resp、err := client.R().
      SetFiles(map[string]string{
        "profile_img": "/Users/jeeva/test-img.png",
        "notes": "/Users/jeeva/text-file.txt",
      }).
      Post("http://myapp.com/upload")

// 複数のファイルを一括アップロードし、同時に他のフォームパラメータを設定する
resp、err := client.R().
      SetFiles(map[string]string{
        "profile_img": "/Users/jeeva/test-img.png",
        "notes": "/Users/jeeva/text-file.txt",
      }).
      SetFormData(map[string]string{
        "first_name": "Jeevanandam",
        "last_name": "M",
        "zip_code": "00001",
        "city": "my city",
        "access_token": "C6A79608-782F-4ED0-A11D-BD82FAD829CD",
      }).
      Post("http://myapp.com/profile")

ファイルのダウンロード

// Restyクライアントの作成
client := resty.New()

// ファイルの出力ディレクトリを設定し、存在しない場合はRestyが自動的に作成します
// SetOutputパラメータが絶対パスで設定されている場合、この設定は任意です。
client.SetOutputDirectory("/Users/tizi365/Downloads")

// ここでHTTPリクエストを送信し、SetOutputパラメータによって設定されたファイルパスにリクエスト結果を保存します
_, err := client.R().
          SetOutput("plugin/ReplyWithHeader-v5.1-beta.zip").
          Get("http://bit.ly/1LouEKr")

// ここでは絶対パスを使用した例
_, err := client.R().
          SetOutput("/MyDownloads/plugin/ReplyWithHeader-v5.1-beta.zip").
          Get("http://bit.ly/1LouEKr")