public async Task <UploadResult> ProcessFile( IFormFile formFile, ImageProcessingOptions options, bool?resizeImages, int?maxWidth, int?maxHeight, string requestedVirtualPath = "", string newFileName = "", bool allowRootPath = true, bool createThumbnail = false, bool?keepOriginal = null ) { await EnsureProjectSettings().ConfigureAwait(false); string currentFsPath = _rootPath.RootFileSystemPath; string currentVirtualPath = _rootPath.RootVirtualPath; string[] virtualSegments = options.ImageDefaultVirtualSubPath.Split('/'); bool doResize = resizeImages ?? options.AutoResize; if ((!string.IsNullOrEmpty(requestedVirtualPath)) && (requestedVirtualPath.StartsWith(_rootPath.RootVirtualPath))) { var virtualSubPath = requestedVirtualPath.Substring(_rootPath.RootVirtualPath.Length); var segments = virtualSubPath.Split('/'); if (segments.Length > 0) { var requestedFsPath = Path.Combine(_rootPath.RootFileSystemPath, Path.Combine(segments)); if (!Directory.Exists(requestedFsPath)) { //_log.LogError("directory not found for currentPath " + requestedFsPath); // user has file system permission and could manually create the needed folder so auto ensure // since it is a sub path of the root EnsureSubFolders(_rootPath.RootFileSystemPath, segments); } currentVirtualPath = requestedVirtualPath; virtualSegments = segments; currentFsPath = Path.Combine(currentFsPath, Path.Combine(virtualSegments)); } } else { // ensure the folders if no currentDir provided, // if it is provided it must be an existing path // options.ImageDefaultVirtualSubPath might not exist on first upload so need to ensure it if (!allowRootPath) { currentVirtualPath = currentVirtualPath + options.ImageDefaultVirtualSubPath; currentFsPath = Path.Combine(currentFsPath, Path.Combine(virtualSegments)); EnsureSubFolders(_rootPath.RootFileSystemPath, virtualSegments); } } string newName; if (!string.IsNullOrEmpty(newFileName)) { newName = _nameRules.GetCleanFileName(newFileName); } else { newName = _nameRules.GetCleanFileName(Path.GetFileName(formFile.FileName)); } var newUrl = currentVirtualPath + "/" + newName; var fsPath = Path.Combine(currentFsPath, newName); var ext = Path.GetExtension(newName); var webSizeName = Path.GetFileNameWithoutExtension(newName) + "-ws" + ext; string webUrl = currentVirtualPath + "/" + webSizeName; var thumbSizeName = Path.GetFileNameWithoutExtension(newName) + "-thumb" + ext; string thumbUrl = currentVirtualPath + "/" + thumbSizeName; var didResize = false; var didCreateThumb = false; try { using (var stream = new FileStream(fsPath, FileMode.Create)) { await formFile.CopyToAsync(stream); } var mimeType = GetMimeType(ext); if ((doResize) && IsWebImageFile(ext)) { int resizeWidth = GetMaxWidth(maxWidth, options); int resizeHeight = GetMaxWidth(maxHeight, options); didResize = _imageResizer.ResizeImage( fsPath, currentFsPath, webSizeName, mimeType, resizeWidth, resizeHeight, options.AllowEnlargement, options.ResizeQuality ); } if (createThumbnail) { didCreateThumb = _imageResizer.ResizeImage( fsPath, currentFsPath, thumbSizeName, mimeType, options.ThumbnailImageMaxWidth, options.ThumbnailImageMaxHeight, false, options.ResizeQuality ); } if (didResize) { if (keepOriginal.HasValue) { if (keepOriginal.Value == false) { File.Delete(fsPath); newUrl = string.Empty; } } else if (!options.KeepOriginalImages) // use default if not explcitely passed { File.Delete(fsPath); newUrl = string.Empty; } } } catch (Exception ex) { _log.LogError($"{ex.Message}:{ex.StackTrace}"); return(new UploadResult { ErrorMessage = _sr["There was an error logged during file processing"] }); } return(new UploadResult { OriginalUrl = newUrl, ResizedUrl = didResize ? webUrl : string.Empty, ThumbUrl = didCreateThumb ? thumbUrl : string.Empty, Name = newName, Length = formFile.Length, Type = formFile.ContentType }); }
public async Task <OperationResult> RenameFile(string requestedVirtualPath, string newNameSegment) { OperationResult result; if (string.IsNullOrEmpty(requestedVirtualPath)) { result = new OperationResult(false); result.Message = sr["Path not provided"]; return(result); } if (string.IsNullOrEmpty(newNameSegment)) { result = new OperationResult(false); result.Message = sr["New name not provided"]; return(result); } await EnsureProjectSettings().ConfigureAwait(false); if (!requestedVirtualPath.StartsWith(rootPath.RootVirtualPath)) { result = new OperationResult(false); result.Message = sr["Invalid path"]; return(result); } var virtualSubPath = requestedVirtualPath.Substring(rootPath.RootVirtualPath.Length); var segments = virtualSubPath.Split('/'); if (segments.Length == 0) { // don't allow delete the root folder result = new OperationResult(false); result.Message = sr["Invalid path"]; return(result); } var currentFsPath = Path.Combine(rootPath.RootFileSystemPath, Path.Combine(segments)); var ext = Path.GetExtension(currentFsPath); if (!File.Exists(currentFsPath)) { result = new OperationResult(false); result.Message = sr["Invalid path"]; return(result); } // pop the last segment segments = segments.Take(segments.Count() - 1).ToArray(); if (Path.HasExtension(newNameSegment) && Path.GetExtension(newNameSegment) == ext) { // all good } else { newNameSegment = Path.GetFileNameWithoutExtension(newNameSegment) + ext; } var cleanFileName = nameRules.GetCleanFileName(newNameSegment); string newFsPath; if (segments.Length > 0) { newFsPath = Path.Combine(Path.Combine(rootPath.RootFileSystemPath, Path.Combine(segments)), cleanFileName); } else { newFsPath = Path.Combine(rootPath.RootFileSystemPath, cleanFileName); } if (File.Exists(newFsPath)) { result = new OperationResult(false); result.Message = sr["Directory already exists"]; return(result); } try { File.Move(currentFsPath, newFsPath); result = new OperationResult(true); return(result); } catch (IOException ex) { log.LogError(MediaLoggingEvents.FOLDER_RENAME, ex, ex.Message + " " + ex.StackTrace); result = new OperationResult(false); result.Message = sr["A error was logged while processing the request"]; return(result); } }