go / net/http
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
)
const baseURL = "https://mediagate.nianjk.com"
const namespace = "{namespace}"
const appToken = "mgtk_app_xxx.<token>"
type UploadResponse struct {
ImageID string `json:"imageId"`
AccessURL string `json:"accessUrl"`
}
type AccessURLResponse struct {
AccessURL string `json:"accessUrl"`
ExpiresAt string `json:"expiresAt"`
}
func uploadImage(path string) (UploadResponse, error) {
file, err := os.Open(path)
if err != nil {
return UploadResponse{}, err
}
defer file.Close()
var body bytes.Buffer
writer := multipart.NewWriter(&body)
part, err := writer.CreateFormFile("file", path)
if err != nil {
return UploadResponse{}, err
}
if _, err := io.Copy(part, file); err != nil {
return UploadResponse{}, err
}
if err := writer.Close(); err != nil {
return UploadResponse{}, err
}
url := baseURL + "/api/v1/namespaces/" + namespace + "/images"
req, err := http.NewRequest(http.MethodPost, url, &body)
if err != nil {
return UploadResponse{}, err
}
req.Header.Set("Authorization", "Bearer "+appToken)
req.Header.Set("Content-Type", writer.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil {
return UploadResponse{}, err
}
defer resp.Body.Close()
if resp.StatusCode >= 300 {
return UploadResponse{}, fmt.Errorf("upload failed: %s", resp.Status)
}
var out UploadResponse
return out, json.NewDecoder(resp.Body).Decode(&out)
}
func createAccessURL(imageID string) (AccessURLResponse, error) {
url := baseURL + "/api/v1/namespaces/" + namespace + "/images/" + imageID + "/access-url"
req, err := http.NewRequest(http.MethodPost, url, nil)
if err != nil {
return AccessURLResponse{}, err
}
req.Header.Set("Authorization", "Bearer "+appToken)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return AccessURLResponse{}, err
}
defer resp.Body.Close()
if resp.StatusCode >= 300 {
return AccessURLResponse{}, fmt.Errorf("access url failed: %s", resp.Status)
}
var out AccessURLResponse
return out, json.NewDecoder(resp.Body).Decode(&out)
}
func main() {
uploaded, err := uploadImage("./sample.png")
if err != nil {
panic(err)
}
fmt.Println("imageId:", uploaded.ImageID)
fmt.Println("upload accessUrl:", uploaded.AccessURL)
access, err := createAccessURL(uploaded.ImageID)
if err != nil {
panic(err)
}
fmt.Println("new accessUrl:", access.AccessURL)
}