allow mixing existing file names and new uploaded files

This commit is contained in:
Gani Georgiev 2024-11-19 17:42:41 +02:00
parent 52c64318c5
commit d919d55b5e
3 changed files with 25 additions and 3 deletions

View File

@ -13,6 +13,7 @@ import (
"github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/forms" "github.com/pocketbase/pocketbase/forms"
"github.com/pocketbase/pocketbase/tools/filesystem" "github.com/pocketbase/pocketbase/tools/filesystem"
"github.com/pocketbase/pocketbase/tools/list"
"github.com/pocketbase/pocketbase/tools/router" "github.com/pocketbase/pocketbase/tools/router"
"github.com/pocketbase/pocketbase/tools/search" "github.com/pocketbase/pocketbase/tools/search"
) )
@ -561,9 +562,28 @@ func recordDataFromRequest(e *core.RequestEvent, record *core.Record) (map[strin
return nil, err return nil, err
} }
if len(uploadedFiles) > 0 { if len(uploadedFiles) > 0 {
for k, v := range uploadedFiles { for k, files := range uploadedFiles {
result[k] = v 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) result = record.ReplaceModifiers(result)
} }

View File

@ -2345,7 +2345,7 @@ func TestRecordCrudUpdate(t *testing.T) {
} }
formData3, mp3, err3 := tests.MockMultipartData(map[string]string{ 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") }, "files")
if err3 != nil { if err3 != nil {
t.Fatal(err3) t.Fatal(err3)
@ -2686,6 +2686,8 @@ func TestRecordCrudUpdate(t *testing.T) {
`"id":"mk5fmymtx4wsprk"`, `"id":"mk5fmymtx4wsprk"`,
`"title":"title_test3"`, `"title":"title_test3"`,
`"files":["`, `"files":["`,
`"300_JdfBOieXAW.png"`,
`"tmpfile_`,
}, },
ExpectedEvents: map[string]int{ ExpectedEvents: map[string]int{
"*": 0, "*": 0,

Binary file not shown.