diff --git a/pkg/files/file.go b/pkg/files/file.go
index 8f9f3bfe70a173318196dd630e4093bdf16028d5..0e4d89f7004413b2c2a0ae9eff663cdcfc0ef3a1 100644
--- a/pkg/files/file.go
+++ b/pkg/files/file.go
@@ -1,9 +1,11 @@
 package files
 
 import (
+	"bytes"
 	"fmt"
 	"io/fs"
 	"strings"
+	"text/template"
 
 	"git.perx.ru/perxis/perxis-go/pkg/id"
 )
@@ -31,6 +33,20 @@ func (f File) Temporary() bool {
 	return strings.HasPrefix(f.ID, TemporaryPrefix)
 }
 
+func (f *File) SetURLWithTemplate(t *template.Template) error {
+	if t == nil {
+		return nil
+	}
+
+	res := new(bytes.Buffer)
+	if err := t.Execute(res, f); err != nil {
+		return err
+	}
+
+	f.URL = res.String()
+	return nil
+}
+
 func (f File) Fetch(i interface{}) interface{} {
 	p, _ := i.(string)
 	switch p {
diff --git a/pkg/files/file_test.go b/pkg/files/file_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..14fb89ce8c054d57ea708a10eb27318b474ff99c
--- /dev/null
+++ b/pkg/files/file_test.go
@@ -0,0 +1,57 @@
+package files
+
+import (
+	"testing"
+	"text/template"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestFile_SetURLWithTemplate(t *testing.T) {
+	tests := []struct {
+		name     string
+		file     *File
+		template *template.Template
+		wantErr  bool
+		wantURL  string
+	}{
+		{
+			name: "template is nil",
+			file: &File{
+				URL: "https://cloud.com/",
+			},
+			template: nil,
+			wantErr:  false,
+			wantURL:  "https://cloud.com/",
+		},
+		{
+			name:     "template with non-existent field",
+			file:     &File{},
+			template: template.Must(template.New("url").Parse("{{.NonExistentField}}")),
+			wantErr:  true,
+		},
+		{
+			name: "success",
+			file: &File{
+				Size:     1024,
+				MimeType: "image/png",
+				Key:      "file-key",
+			},
+			template: template.Must(template.New("url").Parse("https://cloud-proxy.com/{{.Key}}?size={{.Size}}#{{.MimeType}}")),
+			wantErr:  false,
+			wantURL:  "https://cloud-proxy.com/file-key?size=1024#image/png",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			err := tt.file.SetURLWithTemplate(tt.template)
+			if tt.wantErr {
+				require.Error(t, err)
+			} else {
+				require.NoError(t, err)
+				require.Equal(t, tt.wantURL, tt.file.URL)
+			}
+		})
+	}
+}