diff --git a/apis/record_crud.go b/apis/record_crud.go index bf0d4a46..767318e8 100644 --- a/apis/record_crud.go +++ b/apis/record_crud.go @@ -13,6 +13,7 @@ import ( "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/forms" "github.com/pocketbase/pocketbase/tools/filesystem" + "github.com/pocketbase/pocketbase/tools/list" "github.com/pocketbase/pocketbase/tools/router" "github.com/pocketbase/pocketbase/tools/search" ) @@ -561,9 +562,28 @@ func recordDataFromRequest(e *core.RequestEvent, record *core.Record) (map[strin return nil, err } if len(uploadedFiles) > 0 { - for k, v := range uploadedFiles { - result[k] = v + for k, files := range uploadedFiles { + uploaded := make([]any, 0, len(files)) + + // if not remove/prepend/append -> merge with the submitted + // info.Body values to prevent accidental old files deletion + if info.Body[k] != nil && + !strings.HasPrefix(k, "+") && + !strings.HasSuffix(k, "+") && + !strings.HasSuffix(k, "-") { + existing := list.ToUniqueStringSlice(info.Body[k]) + for _, name := range existing { + uploaded = append(uploaded, name) + } + } + + for _, file := range files { + uploaded = append(uploaded, file) + } + + result[k] = uploaded } + result = record.ReplaceModifiers(result) } diff --git a/apis/record_crud_test.go b/apis/record_crud_test.go index a86adf84..46dbc91f 100644 --- a/apis/record_crud_test.go +++ b/apis/record_crud_test.go @@ -2345,7 +2345,7 @@ func TestRecordCrudUpdate(t *testing.T) { } formData3, mp3, err3 := tests.MockMultipartData(map[string]string{ - router.JSONPayloadKey: `{"title": "title_test3", "testPayload": 123}`, + router.JSONPayloadKey: `{"title": "title_test3", "testPayload": 123, "files":"300_JdfBOieXAW.png"}`, }, "files") if err3 != nil { t.Fatal(err3) @@ -2686,6 +2686,8 @@ func TestRecordCrudUpdate(t *testing.T) { `"id":"mk5fmymtx4wsprk"`, `"title":"title_test3"`, `"files":["`, + `"300_JdfBOieXAW.png"`, + `"tmpfile_`, }, ExpectedEvents: map[string]int{ "*": 0, diff --git a/tests/data/data.db b/tests/data/data.db index 50892db4..e22b80d1 100644 Binary files a/tests/data/data.db and b/tests/data/data.db differ