예제 #1
0
        private void DeleteFile(string fileUrl)
        {
            if (fileUrl.Length > 0)
            {
                var relativeFilePath = _fs.GetRelativePath(fileUrl);

                // delete old file
                if (_fs.FileExists(relativeFilePath))
                {
                    _fs.DeleteFile(relativeFilePath);
                }

                var extension = (relativeFilePath.Substring(relativeFilePath.LastIndexOf(".") + 1, relativeFilePath.Length - relativeFilePath.LastIndexOf(".") - 1));
                extension = extension.ToLower();

                //check for thumbnails
                if (",jpeg,jpg,gif,bmp,png,tiff,tif,".IndexOf("," + extension + ",") > -1)
                {
                    //delete thumbnails
                    string relativeThumbFilePath = relativeFilePath.Replace("." + extension, "_thumb");

                    try
                    {
                        if (_fs.FileExists(relativeThumbFilePath + Thumbnailext))
                        {
                            _fs.DeleteFile(relativeThumbFilePath + Thumbnailext);
                        }
                    }
                    catch
                    {
                    }

                    if (_thumbnails != "")
                    {
                        var thumbnailSizes = _thumbnails.Split(";".ToCharArray());
                        foreach (var thumb in thumbnailSizes)
                        {
                            if (thumb != "")
                            {
                                string relativeExtraThumbFilePath = relativeThumbFilePath + "_" + thumb + Thumbnailext;

                                try
                                {
                                    if (_fs.FileExists(relativeExtraThumbFilePath))
                                    {
                                        _fs.DeleteFile(relativeExtraThumbFilePath);
                                    }
                                }
                                catch
                                {
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #2
0
        public void delete(int id, string username, string password)
        {
            Authenticate(username, password);

            Media m = new Media(id);

            if (m.HasChildren)
            {
                throw new Exception("Cannot delete Media " + id + " as it has child nodes");
            }

            Property p = m.getProperty("umbracoFile");

            if (p != null)
            {
                if (!(p.Value == System.DBNull.Value))
                {
                    var path = _fs.GetRelativePath(p.Value.ToString());
                    if (_fs.FileExists(path))
                    {
                        _fs.DeleteFile(path, true);
                    }
                }
            }

            m.delete();
        }
예제 #3
0
        /// <summary>
        /// Converts the value received from the editor into the value can be stored in the database.
        /// </summary>
        /// <param name="editorValue">The value received from the editor.</param>
        /// <param name="currentValue">The current value of the property</param>
        /// <returns>The converted value.</returns>
        /// <remarks>
        /// <para>The <paramref name="currentValue"/> is used to re-use the folder, if possible.</para>
        /// <para>The <paramref name="editorValue"/> is value passed in from the editor. We normally don't care what
        /// the editorValue.Value is set to because we are more interested in the files collection associated with it,
        /// however we do care about the value if we are clearing files. By default the editorValue.Value will just
        /// be set to the name of the file - but again, we just ignore this and deal with the file collection in
        /// editorValue.AdditionalData.ContainsKey("files")</para>
        /// <para>We only process ONE file. We understand that the current value may contain more than one file,
        /// and that more than one file may be uploaded, so we take care of them all, but we only store ONE file.
        /// Other places (FileUploadPropertyEditor...) do NOT deal with multiple files, and our logic for reusing
        /// folders would NOT work, etc.</para>
        /// </remarks>
        public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue)
        {
            currentValue = currentValue ?? string.Empty;

            // at that point,
            // currentValue is either empty or "/media/path/to/img.jpg"
            // editorValue.Value is { "clearFiles": true } or { "selectedFiles": "img1.jpg,img2.jpg" }
            // comparing them makes little sense

            // check the editorValue value to see whether we need to clear files
            var editorJsonValue = editorValue.Value as JObject;
            var clears          = editorJsonValue != null && editorJsonValue["clearFiles"] != null && editorJsonValue["clearFiles"].Value <bool>();
            var uploads         = editorValue.AdditionalData.ContainsKey("files") && editorValue.AdditionalData["files"] is IEnumerable <ContentItemFile>;

            // nothing = no changes, return what we have already (leave existing files intact)
            if (clears == false && uploads == false)
            {
                return(currentValue);
            }

            // get the current file paths
            var currentPaths = currentValue.ToString()
                               .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                               .Select(x => _mediaFileSystem.GetRelativePath(x)) // get the fs-relative path
                               .ToArray();

            // if clearing, remove these files and return
            if (clears)
            {
                foreach (var pathToRemove in currentPaths)
                {
                    _mediaFileSystem.DeleteFile(pathToRemove, true);
                }
                return(string.Empty); // no more files
            }

            // ensure we have the required guids
            if (editorValue.AdditionalData.ContainsKey("cuid") == false || // for the content item
                editorValue.AdditionalData.ContainsKey("puid") == false)    // and the property type
            {
                throw new Exception("Missing cuid/puid additional data.");
            }
            var cuido = editorValue.AdditionalData["cuid"];
            var puido = editorValue.AdditionalData["puid"];

            if ((cuido is Guid) == false || (puido is Guid) == false)
            {
                throw new Exception("Invalid cuid/puid additional data.");
            }
            var cuid = (Guid)cuido;
            var puid = (Guid)puido;

            if (cuid == Guid.Empty || puid == Guid.Empty)
            {
                throw new Exception("Invalid cuid/puid additional data.");
            }

            // process the files
            var files = ((IEnumerable <ContentItemFile>)editorValue.AdditionalData["files"]).ToArray();

            var       newPaths  = new List <string>();
            const int maxLength = 1; // we only process ONE file

            for (var i = 0; i < maxLength /*files.Length*/; i++)
            {
                var file = files[i];

                // skip invalid files
                if (UploadFileTypeValidator.ValidateFileExtension(file.FileName) == false)
                {
                    continue;
                }

                // get the filepath
                // in case we are using the old path scheme, try to re-use numbers (bah...)
                var reuse    = i < currentPaths.Length ? currentPaths[i] : null;                // this would be WRONG with many files
                var filepath = _mediaFileSystem.GetMediaPath(file.FileName, reuse, cuid, puid); // fs-relative path

                using (var filestream = File.OpenRead(file.TempFilePath))
                {
                    _mediaFileSystem.AddFile(filepath, filestream, true); // must overwrite!

                    var ext = _mediaFileSystem.GetExtension(filepath);
                    if (_mediaFileSystem.IsImageFile(ext) && ext != ".svg")
                    {
                        var preValues = editorValue.PreValues.FormatAsDictionary();
                        var sizes     = preValues.Any() ? preValues.First().Value.Value : string.Empty;
                        using (var image = Image.FromStream(filestream))
                            _mediaFileSystem.GenerateThumbnails(image, filepath, sizes);
                    }

                    // all related properties (auto-fill) are managed by FileUploadPropertyEditor
                    // when the content is saved (through event handlers)

                    newPaths.Add(filepath);
                }
            }

            // remove all temp files
            foreach (var file in files)
            {
                File.Delete(file.TempFilePath);
            }

            // remove files that are not there anymore
            foreach (var pathToRemove in currentPaths.Except(newPaths))
            {
                _mediaFileSystem.DeleteFile(pathToRemove, true);
            }


            return(string.Join(",", newPaths.Select(x => _mediaFileSystem.GetUrl(x))));
        }
        /// <summary>
        /// Converts the value received from the editor into the value can be stored in the database.
        /// </summary>
        /// <param name="editorValue">The value received from the editor.</param>
        /// <param name="currentValue">The current value of the property</param>
        /// <returns>The converted value.</returns>
        /// <remarks>
        /// <para>The <paramref name="currentValue"/> is used to re-use the folder, if possible.</para>
        /// <para>editorValue.Value is used to figure out editorFile and, if it has been cleared, remove the old file - but
        /// it is editorValue.AdditionalData["files"] that is used to determine the actual file that has been uploaded.</para>
        /// </remarks>
        public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue)
        {
            // get the current path
            var currentPath = string.Empty;

            try
            {
                var svalue      = currentValue as string;
                var currentJson = string.IsNullOrWhiteSpace(svalue) ? null : JObject.Parse(svalue);
                if (currentJson != null && currentJson["src"] != null)
                {
                    currentPath = currentJson["src"].Value <string>();
                }
            }
            catch (Exception ex)
            {
                // for some reason the value is invalid so continue as if there was no value there
                LogHelper.WarnWithException <ImageCropperPropertyValueEditor>("Could not parse current db value to a JObject.", ex);
            }
            if (string.IsNullOrWhiteSpace(currentPath) == false)
            {
                currentPath = _mediaFileSystem.GetRelativePath(currentPath);
            }

            // get the new json and path
            JObject editorJson = null;
            var     editorFile = string.Empty;

            if (editorValue.Value != null)
            {
                editorJson = editorValue.Value as JObject;
                if (editorJson != null && editorJson["src"] != null)
                {
                    editorFile = editorJson["src"].Value <string>();
                }
            }

            // ensure we have the required guids
            if (editorValue.AdditionalData.ContainsKey("cuid") == false || // for the content item
                editorValue.AdditionalData.ContainsKey("puid") == false)    // and the property type
            {
                throw new Exception("Missing cuid/puid additional data.");
            }
            var cuido = editorValue.AdditionalData["cuid"];
            var puido = editorValue.AdditionalData["puid"];

            if ((cuido is Guid) == false || (puido is Guid) == false)
            {
                throw new Exception("Invalid cuid/puid additional data.");
            }
            var cuid = (Guid)cuido;
            var puid = (Guid)puido;

            if (cuid == Guid.Empty || puid == Guid.Empty)
            {
                throw new Exception("Invalid cuid/puid additional data.");
            }

            // editorFile is empty whenever a new file is being uploaded
            // or when the file is cleared (in which case editorJson is null)
            // else editorFile contains the unchanged value

            var uploads = editorValue.AdditionalData.ContainsKey("files") && editorValue.AdditionalData["files"] is IEnumerable <ContentItemFile>;
            var files   = uploads ? ((IEnumerable <ContentItemFile>)editorValue.AdditionalData["files"]).ToArray() : new ContentItemFile[0];
            var file    = uploads ? files.FirstOrDefault() : null;

            if (file == null) // not uploading a file
            {
                // if editorFile is empty then either there was nothing to begin with,
                // or it has been cleared and we need to remove the file - else the
                // value is unchanged.
                if (string.IsNullOrWhiteSpace(editorFile) && string.IsNullOrWhiteSpace(currentPath) == false)
                {
                    _mediaFileSystem.DeleteFile(currentPath, true);
                    return(null); // clear
                }

                return(editorJson == null ? null : editorJson.ToString()); // unchanged
            }

            // process the file
            var filepath = editorJson == null ? null : ProcessFile(editorValue, file, currentPath, cuid, puid);

            // remove all temp files
            foreach (var f in files)
            {
                File.Delete(f.TempFilePath);
            }

            // remove current file if replaced
            if (currentPath != filepath && string.IsNullOrWhiteSpace(currentPath) == false)
            {
                _mediaFileSystem.DeleteFile(currentPath, true);
            }

            // update json and return
            if (editorJson == null)
            {
                return(null);
            }
            editorJson["src"] = filepath == null ? string.Empty : _mediaFileSystem.GetUrl(filepath);
            return(editorJson.ToString());
        }