Skip to content

Instantly share code, notes, and snippets.

@kyktommy
Created March 11, 2019 07:22
Show Gist options
  • Save kyktommy/597cee53e5654b5d8038ab0f06738611 to your computer and use it in GitHub Desktop.
Save kyktommy/597cee53e5654b5d8038ab0f06738611 to your computer and use it in GitHub Desktop.
golang dropbox upload
package dropbox
import (
"bytes"
"encoding/json"
"errors"
"io/ioutil"
"log"
"net/http"
)
const (
oauth2AccessToken = ""
)
type UploadInfo struct {
Data []byte
FullPath string
}
type ResponseInfo struct {
Response string
Err error
}
func UploadFile(uploadInfo UploadInfo) ResponseInfo {
client := &http.Client{}
req, err := http.NewRequest("POST", "https://content.dropboxapi.com/2/files/upload", bytes.NewReader(uploadInfo.Data))
if err != nil {
return ResponseInfo{"", err}
}
req.Header.Set("Content-Type", "application/octet-stream")
req.Header.Set("Authorization", "Bearer "+oauth2AccessToken)
req.Header.Set("Dropbox-API-Arg", "{\"path\":\""+uploadInfo.FullPath+"\"}")
resp, err := client.Do(req)
if err != nil {
return ResponseInfo{"", err}
}
defer resp.Body.Close()
respByte, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("fail to read response data")
return ResponseInfo{"", err}
}
var mapObject = make(map[string]interface{})
err = json.Unmarshal(respByte, &mapObject)
if err != nil {
return ResponseInfo{"", errors.New(string(respByte))}
}
fileName, check := mapObject["path_display"].(string)
if !check {
return ResponseInfo{"", errors.New(string(respByte))}
}
responseInfo := getLinkFile(client, fileName)
if responseInfo.Err != nil {
return ResponseInfo{"", err}
}
return ResponseInfo{responseInfo.Response, nil}
}
func getLinkFile(client *http.Client, fileName string) ResponseInfo {
req, err := http.NewRequest("POST", "https://api.dropboxapi.com/2/files/get_temporary_link",
bytes.NewReader([]byte("{\"path\":\""+fileName+"\"}")))
if err != nil {
return ResponseInfo{"", err}
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+oauth2AccessToken)
resp, err := client.Do(req)
if err != nil {
return ResponseInfo{"", err}
}
defer resp.Body.Close()
respByte, err := ioutil.ReadAll(resp.Body)
if err != nil {
return ResponseInfo{"", err}
}
var mapObject = make(map[string]interface{})
err = json.Unmarshal(respByte, &mapObject)
if err != nil {
return ResponseInfo{"", errors.New(string(respByte))}
}
link, check := mapObject["link"].(string)
if !check {
return ResponseInfo{"", errors.New(string(respByte))}
}
return ResponseInfo{link, nil}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment