diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js
index db1e38adc626..5492fee1a0ab 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js
@@ -85,7 +85,7 @@
/** Called when the component has linked all elements, this is when the form controller is available */
function postLink() {
-
+
}
function initialize() {
@@ -186,7 +186,7 @@
});
}
}
-
+
}
}
@@ -325,7 +325,8 @@
*/
onFilesChanged: "&",
onInit: "&",
- required: "="
+ required: "=",
+ acceptFileExt: ""
},
transclude: true,
controllerAs: 'vm',
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbsinglefileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbsinglefileupload.directive.js
index df4f68950e30..e1793208983c 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbsinglefileupload.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbsinglefileupload.directive.js
@@ -9,19 +9,24 @@
* is required because the only way to reset an upload control is to replace it's html.
**/
function umbSingleFileUpload($compile) {
+
+ // cause we have the same template twice I choose to extract it to its own variable:
+ var innerTemplate = "";
+
return {
restrict: "E",
scope: {
- rebuild: "="
+ rebuild: "=",
+ acceptFileExt: ""
},
replace: true,
- template: "
",
- link: function (scope, el, attrs) {
+ template: "
"+innerTemplate+"
",
+ link: function (scope, el) {
scope.$watch("rebuild", function (newVal, oldVal) {
if (newVal && newVal !== oldVal) {
//recompile it!
- el.html("");
+ el.html(innerTemplate);
$compile(el.contents())(scope);
}
});
@@ -30,4 +35,4 @@ function umbSingleFileUpload($compile) {
};
}
-angular.module('umbraco.directives').directive("umbSingleFileUpload", umbSingleFileUpload);
\ No newline at end of file
+angular.module('umbraco.directives').directive("umbSingleFileUpload", umbSingleFileUpload);
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html b/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html
index a6eb60d15cfe..09e85ff3995e 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html
@@ -6,9 +6,9 @@
Click to upload
-
+
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js
index c485f4bbc6e9..4f1016e68028 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js
@@ -11,11 +11,14 @@
*
*/
function fileUploadController($scope, fileManager) {
-
+
$scope.fileChanged = onFileChanged;
//declare a special method which will be called whenever the value has changed from the server
$scope.model.onValueChanged = onValueChanged;
+
+ $scope.fileExtensionsString = $scope.model.config.fileExtensions ? $scope.model.config.fileExtensions.map(x => "."+x.value).join(",") : "";
+
/**
* Called when the file selection value changes
* @param {any} value
@@ -38,12 +41,12 @@
files: []
});
}
-
+
};
angular.module("umbraco")
.controller('Umbraco.PropertyEditors.FileUploadController', fileUploadController)
- .run(function (mediaHelper, umbRequestHelper, assetsService) {
+ .run(function (mediaHelper) {
if (mediaHelper && mediaHelper.registerFileResolver) {
//NOTE: The 'entity' can be either a normal media entity or an "entity" returned from the entityResource
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html
index 522278e99ec4..36509e894796 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html
@@ -4,6 +4,7 @@
property-alias="{{model.alias}}"
value="model.value"
required="model.validation.mandatory"
- on-files-selected="fileChanged(value)">
+ on-files-selected="fileChanged(value)"
+ accept-file-ext="fileExtensionsString">
diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs
index dfe6939552a7..38ab4e4f4e2b 100644
--- a/src/Umbraco.Web/Editors/MediaController.cs
+++ b/src/Umbraco.Web/Editors/MediaController.cs
@@ -37,6 +37,8 @@
using Umbraco.Web.Editors.Binders;
using Umbraco.Web.Editors.Filters;
using Umbraco.Core.Models.Entities;
+using static Umbraco.Web.PropertyEditors.FileUploadConfiguration;
+using Umbraco.Web.PropertyEditors;
namespace Umbraco.Web.Editors
{
@@ -704,10 +706,36 @@ public async Task PostAddFile()
if (result.FormData["contentTypeAlias"] == Constants.Conventions.MediaTypes.AutoSelect)
{
- if (Current.Configs.Settings().Content.ImageFileTypes.Contains(ext))
+ var mediaTypes = Services.MediaTypeService.GetAll();
+ // Look up MediaTypes
+ foreach (var mediaTypeItem in mediaTypes)
+ {
+ var fileProperty = mediaTypeItem.CompositionPropertyTypes.FirstOrDefault(x => x.Alias == "umbracoFile");
+ if (fileProperty != null) {
+ var dataTypeKey = fileProperty.DataTypeKey;
+ var dataType = Services.DataTypeService.GetDataType(dataTypeKey);
+
+ if (dataType != null && dataType.Configuration is IFileExtensionsConfig fileExtensionsConfig) {
+ var fileExtensions = fileExtensionsConfig.FileExtensions;
+ if (fileExtensions != null)
+ {
+ if (fileExtensions.Where(x => x.Value == ext).Count() != 0)
+ {
+ mediaType = mediaTypeItem.Alias;
+ break;
+ }
+ }
+ }
+ }
+
+ }
+
+ // If media type is still File then lets check if its a image.
+ if (mediaType == Constants.Conventions.MediaTypes.File && Current.Configs.Settings().Content.ImageFileTypes.Contains(ext))
{
mediaType = Constants.Conventions.MediaTypes.Image;
}
+
}
else
{
diff --git a/src/Umbraco.Web/PropertyEditors/FileExtensionConfigItem.cs b/src/Umbraco.Web/PropertyEditors/FileExtensionConfigItem.cs
new file mode 100644
index 000000000000..859b3b35ebe6
--- /dev/null
+++ b/src/Umbraco.Web/PropertyEditors/FileExtensionConfigItem.cs
@@ -0,0 +1,13 @@
+using Newtonsoft.Json;
+
+namespace Umbraco.Web.PropertyEditors
+{
+ public class FileExtensionConfigItem : IFileExtensionConfigItem
+ {
+ [JsonProperty("id")]
+ public int Id { get; set; }
+
+ [JsonProperty("value")]
+ public string Value { get; set; }
+ }
+}
diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadConfiguration.cs b/src/Umbraco.Web/PropertyEditors/FileUploadConfiguration.cs
new file mode 100644
index 000000000000..51259a90fa69
--- /dev/null
+++ b/src/Umbraco.Web/PropertyEditors/FileUploadConfiguration.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using Umbraco.Core.PropertyEditors;
+
+namespace Umbraco.Web.PropertyEditors
+{
+ ///
+ /// Represents the configuration for the file upload address value editor.
+ ///
+ public class FileUploadConfiguration : IFileExtensionsConfig
+ {
+
+ [ConfigurationField("fileExtensions", "Accepted file extensions", "multivalues")]
+ public List FileExtensions { get; set; } = new List();
+ }
+}
diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadConfigurationEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadConfigurationEditor.cs
new file mode 100644
index 000000000000..4803254eb762
--- /dev/null
+++ b/src/Umbraco.Web/PropertyEditors/FileUploadConfigurationEditor.cs
@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+using Umbraco.Core;
+using Umbraco.Core.PropertyEditors;
+
+namespace Umbraco.Web.PropertyEditors
+{
+ ///
+ /// Represents the configuration editor for the file upload value editor.
+ ///
+ public class FileUploadConfigurationEditor : ConfigurationEditor
+ {
+
+ }
+}
diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs
index 052af18aa10a..a105d490be26 100644
--- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs
+++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyEditor.cs
@@ -32,6 +32,10 @@ public FileUploadPropertyEditor(ILogger logger, IMediaFileSystem mediaFileSystem
_uploadAutoFillProperties = new UploadAutoFillProperties(_mediaFileSystem, logger, contentSection);
}
+
+ ///
+ protected override IConfigurationEditor CreateConfigurationEditor() => new FileUploadConfigurationEditor();
+
///
/// Creates the corresponding property value editor.
///
diff --git a/src/Umbraco.Web/PropertyEditors/IFileExtensionConfig.cs b/src/Umbraco.Web/PropertyEditors/IFileExtensionConfig.cs
new file mode 100644
index 000000000000..c4934540c793
--- /dev/null
+++ b/src/Umbraco.Web/PropertyEditors/IFileExtensionConfig.cs
@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+using Umbraco.Web.PropertyEditors;
+
+namespace Umbraco.Core.PropertyEditors
+{
+ ///
+ /// Marker interface for any editor configuration that supports defining file extensions
+ ///
+ public interface IFileExtensionsConfig
+ {
+ List FileExtensions { get; set; }
+ }
+}
diff --git a/src/Umbraco.Web/PropertyEditors/IFileExtensionConfigItem.cs b/src/Umbraco.Web/PropertyEditors/IFileExtensionConfigItem.cs
new file mode 100644
index 000000000000..682e8815659a
--- /dev/null
+++ b/src/Umbraco.Web/PropertyEditors/IFileExtensionConfigItem.cs
@@ -0,0 +1,11 @@
+using Newtonsoft.Json;
+
+namespace Umbraco.Web.PropertyEditors
+{
+ public interface IFileExtensionConfigItem
+ {
+ int Id { get; set; }
+
+ string Value { get; set; }
+ }
+}
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 1b48b9ca0d37..6f7d2b3166d7 100644
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -257,7 +257,13 @@
+
+
+
+
+
+