Skip to content

Files Upload

Allows a user to upload images and files.

Show Code
package main
import (
"fmt"
"image"
"path/filepath"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/storage"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.NewWithID("com.example.fileupload")
myWindow := myApp.NewWindow("File/Image Upload")
// Label to show file info or errors
infoLabel := widget.NewLabel("No file selected")
// Placeholder for displaying images
imageDisplay := canvas.NewImageFromResource(nil)
imageDisplay.FillMode = canvas.ImageFillContain
imageDisplay.SetMinSize(fyne.NewSize(200, 200))
// Button to open file dialog
uploadButton := widget.NewButton("Upload File", func() {
fd := dialog.NewFileOpen(func(reader fyne.URIReadCloser, err error) {
if err != nil {
// Handle unexpected dialog errors
dialog.ShowError(fmt.Errorf("failed to open file: %w", err), myWindow)
return
}
if reader == nil {
// User cancelled selection
infoLabel.SetText("No file selected")
return
}
defer reader.Close()
// Check file extension
ext := filepath.Ext(reader.URI().Name())
if ext != ".png" && ext != ".jpg" && ext != ".jpeg" && ext != ".gif" {
infoLabel.SetText("Unsupported file type: " + ext)
return
}
// Decode image to verify it's valid
img, _, imgErr := image.Decode(reader)
if imgErr != nil {
infoLabel.SetText("Error decoding image: " + imgErr.Error())
return
}
// If valid, show image and file details
imageDisplay.Image = img
imageDisplay.Refresh()
fileInfo := fmt.Sprintf("File: %s\nSize: %dx%d px", reader.URI().Name(), img.Bounds().Dx(), img.Bounds().Dy())
infoLabel.SetText(fileInfo)
}, myWindow)
// Set filter to only images
fd.SetFilter(storage.NewExtensionFileFilter([]string{".png", ".jpg", ".jpeg", ".gif"}))
fd.Show()
})
// Layout
content := container.NewVBox(
uploadButton,
infoLabel,
imageDisplay,
)
myWindow.SetContent(content)
myWindow.Resize(fyne.NewSize(400, 400))
myWindow.ShowAndRun()
}