Unityで files.getUploadURLExternal と files.completeUploadExternal を使ってSlackにファイルをアップロードする

files.uploadが廃止になると聞いたので。

SendToSlack.cs
try
{
    const string fileName = "log.txt";
    var initialComment = "コメント";
    var logBytes = Encoding.UTF8.GetBytes(logText.ToString());

    string uploadUrl;
    string fileId;

    {
        using var request = UnityWebRequest.Get($"https://slack.com/api/files.getUploadURLExternal?filename={fileName}&length={logBytes.Length}&snippet_type=text");
        request.SetRequestHeader("Authorization", $"Bearer {BotUserOAuthToken}");
        var response = await request.SendWebRequest();
        var temp = JsonUtility.FromJson<FilesGetUploadURLExternalResponse>(response.downloadHandler.text);
        if (!temp.ok)
        {
            UnityEngine.Debug.LogError("files.getUploadURLExternal failed");
            return;
        }

        uploadUrl = temp.upload_url;
        fileId = temp.file_id;
    }

    {
        var form = new WWWForm();
        form.AddBinaryData("file", logBytes, fileName);
        using var request = UnityWebRequest.Post(uploadUrl, form);
        await request.SendWebRequest();
    }

    {
        var wwwForm = new WWWForm();
        wwwForm.AddField("initial_comment", initialComment);
        wwwForm.AddField("channel_id", SlackChannelId);
        wwwForm.AddField("files", $"[{{\"id\":\"{fileId}\"}}]");
        using var request = UnityWebRequest.Post("https://slack.com/api/files.completeUploadExternal", wwwForm);
        request.SetRequestHeader("Authorization", $"Bearer {BotUserOAuthToken}");
        var response = await request.SendWebRequest();
        var temp = JsonUtility.FromJson<FilesCompleteUploadExternalResponse>(response.downloadHandler.text);
        if (!temp.ok)
        {
            UnityEngine.Debug.LogError("files.completeUploadExternal failed");
            return;
        }
    }

    UnityEngine.Debug.Log("Send success!");
}
catch (Exception e)
{
    UnityEngine.Debug.LogError($"Send failed {e}");
}

// ===== //

[Serializable]
private class FilesGetUploadURLExternalResponse
{
    // ReSharper disable InconsistentNaming
    public bool ok;
    public string upload_url;
    public string file_id;
    // ReSharper restore InconsistentNaming
}
[Serializable]
private class FilesCompleteUploadExternalResponse
{
    // ReSharper disable InconsistentNaming
    public bool ok;
    // ReSharper restore InconsistentNaming
}