4.3 KiB
4.3 KiB
File Uploads in go-unifi
This document describes how to use the file upload functionality in the go-unifi client.
Overview
The go-unifi client provides two methods for uploading files to the UniFi controller:
UploadFile- Upload a file from a file path on diskUploadFileFromReader- Upload a file from anio.Reader(e.g., from memory, network stream, etc.)
Both methods use the multipart/form-data format for file uploads, which is required by the UniFi controller.
Examples
Uploading a file from disk
package main
import (
"context"
"log"
"github.com/filipowm/go-unifi/unifi"
)
func main() {
// Create a client
client, err := unifi.NewClient(&unifi.ClientConfig{
URL: "https://your-unifi-controller:8443",
User: "your-username",
Password: "your-password",
})
if err != nil {
log.Fatalf("Error creating client: %v", err)
}
// Prepare any additional form fields if needed
formFields := map[string]string{
"description": "My uploaded file",
}
// Upload the file to the controller
var response map[string]interface{} // Adjust this type based on the expected response
err = client.UploadFile(
context.Background(),
"/api/s/default/upload", // The API endpoint to upload to
"/path/to/your/file.txt", // Path to the file on disk
"file", // Form field name for the file
formFields, // Additional form fields
&response, // Response structure to capture the result
)
if err != nil {
log.Fatalf("Error uploading file: %v", err)
}
log.Printf("Upload successful: %v", response)
}
Uploading a file from memory
package main
import (
"bytes"
"context"
"log"
"github.com/paultyng/go-unifi/unifi"
)
func main() {
// Create a client
client, err := unifi.NewClient(&unifi.ClientConfig{
URL: "https://your-unifi-controller:8443",
User: "your-username",
Password: "your-password",
})
if err != nil {
log.Fatalf("Error creating client: %v", err)
}
// Create file content in memory
fileContent := []byte("This is some test content to upload")
reader := bytes.NewReader(fileContent)
// Upload the file from the reader
var response map[string]interface{} // Adjust this type based on the expected response
err = client.UploadFileFromReader(
context.Background(),
"/api/s/default/upload", // The API endpoint to upload to
reader, // Reader with the file content
"myfile.txt", // Filename to use in the upload
"file", // Form field name for the file
nil, // No additional form fields
&response, // Response structure to capture the result
)
if err != nil {
log.Fatalf("Error uploading file: %v", err)
}
log.Printf("Upload successful: %v", response)
}
API Reference
UploadFile
func (c *client) UploadFile(ctx context.Context, apiPath, filePath, fieldName string, formFields map[string]string, respBody interface{}) error
Uploads a file to the UniFi controller from a file path.
Parameters:
ctx: The context for the requestapiPath: The API endpoint path to upload the file tofilePath: Path to the file on diskfieldName: Form field name for the file (defaults to "file" if empty)formFields: Additional form fields to include in the upload (can be nil)respBody: Structure to decode the response into (can be nil)
UploadFileFromReader
func (c *client) UploadFileFromReader(ctx context.Context, apiPath string, reader io.Reader, filename, fieldName string, formFields map[string]string, respBody interface{}) error
Uploads a file to the UniFi controller from an io.Reader.
Parameters:
ctx: The context for the requestapiPath: The API endpoint path to upload the file toreader: Reader with the file contentfilename: Name of the file to use in the uploadfieldName: Form field name for the file (defaults to "file" if empty)formFields: Additional form fields to include in the upload (can be nil)respBody: Structure to decode the response into (can be nil)
Notes
- These methods use
POSTrequests for file uploads - The UniFi controller typically expects files to be uploaded with the field name "file", but this can be changed as needed
- The content type for the request is automatically set to "multipart/form-data" with the correct boundary
- All existing client features like interceptors, error handling, and request validation are preserved