Skip to content

Deleting a file from a “form.File” field does not work. #658

Open
@botwetix

Description

@botwetix

Bug Description

Adding and modifying a file with “form.File” fields in a form works correctly. However, deleting the file does not work.

How to reproduce

  1. Create table 'cars' in database
CREATE TABLE cars (
     id INT AUTO_INCREMENT PRIMARY KEY, 
     model VARCHAR(255),  
     img VARCHAR(255) 
);
  1. Add support table 'cars' to GoAdmin
  • file tables/tables.go
package tables

import "github.com/GoAdminGroup/go-admin/plugins/admin/modules/table"


var Generators = map[string]table.Generator{
	"cars": GetCarsTable,
}
  • file tables/cars.go
package tables

import (
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/modules/db"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table"
	"github.com/GoAdminGroup/go-admin/template/types/form"
)

func GetCarsTable(ctx *context.Context) table.Table {

	cars := table.NewDefaultTable(ctx, table.Config{
		Driver:     "mysql",
		Connection: "default",
		CanAdd:     true,
		Editable:   true,
		Deletable:  true,
		Exportable: true,
		PrimaryKey: table.PrimaryKey{
			Type: db.Int,
			Name: "id",
		},
	})

	info := cars.GetInfo()
	info.SetTable("cars").SetTitle("List of cars").HideDetailButton()
	info.AddField("ID", "id", db.Int).FieldSortable()
	info.AddField("Model", "model", db.Varchar).FieldSortable()

	formList := cars.GetForm()
	formList.SetTable("cars").SetTitle("Car")
	formList.AddField("Model", "model", db.Varchar, form.Text).FieldMust()
	formList.AddField("Image", "img", db.Varchar, form.File)

	return cars
}
  1. Go to /admin/info/cars
  2. Add a new car
  3. Set model and upload a picture on "image" field
  4. Save the new car
  5. Edit the car
  6. Delete the picture on "image" field.
  7. Save.
    -> Picture always set on the "image" field - no change in database.
Capture.video.du.13-06-2025.12.28.21.webm

Expect

The database field should be emptied of the file path.

How to solve the problem

The problem is located in the plugins/admin/controller/edit.go file, around line 166:
A condition is missing in the second if.
Currently, when deleting a file, you pass through the 2 if instead of just the first -> the value of the field is therefore not stored in the database.

Actually

	for i := 0; i < len(formPanel.FieldList); i++ {
		if formPanel.FieldList[i].FormType == form.File &&
			len(param.MultiForm.File[formPanel.FieldList[i].Field]) == 0 &&
			len(param.MultiForm.Value[formPanel.FieldList[i].Field+"__delete_flag"]) > 0 &&
			param.MultiForm.Value[formPanel.FieldList[i].Field+"__delete_flag"][0] != "1" {
			param.MultiForm.Value[formPanel.FieldList[i].Field] = []string{""}
		}
		if formPanel.FieldList[i].FormType == form.File &&
			len(param.MultiForm.Value[formPanel.FieldList[i].Field+"__change_flag"]) > 0 &&
			param.MultiForm.Value[formPanel.FieldList[i].Field+"__change_flag"][0] != "1" {
			delete(param.MultiForm.Value, formPanel.FieldList[i].Field)
		}
	}

With fix

	for i := 0; i < len(formPanel.FieldList); i++ {
		if formPanel.FieldList[i].FormType == form.File &&
			len(param.MultiForm.File[formPanel.FieldList[i].Field]) == 0 &&
			len(param.MultiForm.Value[formPanel.FieldList[i].Field+"__delete_flag"]) > 0 &&
			param.MultiForm.Value[formPanel.FieldList[i].Field+"__delete_flag"][0] != "1" {
			param.MultiForm.Value[formPanel.FieldList[i].Field] = []string{""}
		}
		if formPanel.FieldList[i].FormType == form.File &&
		        len(param.MultiForm.File[formPanel.FieldList[i].Field]) != 0 &&
			len(param.MultiForm.Value[formPanel.FieldList[i].Field+"__change_flag"]) > 0 &&
			param.MultiForm.Value[formPanel.FieldList[i].Field+"__change_flag"][0] != "1" {
			delete(param.MultiForm.Value, formPanel.FieldList[i].Field)
		}
	}

Versions

  • GoAdmin version: 1.2.26
  • golang version: 1.23.4
  • Browser: All
  • OS: Linux

Metadata

Metadata

Assignees

No one assigned

    Labels

    🐛bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions