package main import ( "bytes" "errors" "fmt" "io" "log" "mime/multipart" "net/http" "os" "path/filepath" "regexp" "strconv" ) /* Demonstration of using the tusd as a client to send file uploads with just multiparts being written to the server (acting as a proxy between client and s3) */ func main() { SendPostRequest("http://localhost:8080/files/upload/", "test.txt", "txt") } func SendPostRequest(url string, filename string, filetype string) (string, error) { file, err := os.Open(filename) if err != nil { log.Fatal(err) } defer file.Close() body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile(filetype, filepath.Base(file.Name())) if err != nil { log.Fatal(err) } io.Copy(part, file) writer.Close() request, err := http.NewRequest("POST", url, body) if err != nil { log.Fatal(err) } fileStats, err := file.Stat() if err != nil { // Could not obtain stat, handle error } fileSize := strconv.FormatInt(fileStats.Size(), 10) request.Header.Add("Tus-Resumable", "1.0.0") request.Header.Add("Upload-Offset", "0") request.Header.Add("Content-Length", fileSize) request.Header.Add("Upload-Length", fileSize) request.Header.Add("Content-Type", writer.FormDataContentType()) client := &http.Client{} response, err := client.Do(request) if err != nil { log.Fatal(err) } defer response.Body.Close() if response.StatusCode != 201 { fmt.Println("There was an error with the request ", response.StatusCode) } else { r := regexp.MustCompile(`files\/upload\/(.*?)\+`) subStrings := r.FindStringSubmatch(response.Header["Location"][0]) // [0] is the full string storedFileName := subStrings[1] fmt.Println("stored File Name "+storedFileName, " status code: ", response.StatusCode) return storedFileName, nil } return "", errors.New("The file upload failed") }