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 { } } } } } } }
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(); }
/// <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()); }