/// <summary> /// Saves uploaded IFormFile file to physical file path. If <paramref name="file"/>.Lenght is lower or equal than 0 then returns empty string. /// Target Path will be : "<paramref name ="basePath"></paramref>/<b><paramref name="folderNameCreator"/>()</b>/<paramref name="entity"></paramref>.<paramref name="propertyName"/>" /// </summary> /// /// <para><b>Remarks:</b></para> /// /// <remarks> /// /// <para> Don't forget validate file with <see cref="ValidateFile(IFormFile, long, List{string}, FileType)"/>, before use this method.</para> /// /// </remarks> /// /// <typeparam name="TEntity"></typeparam> /// <param name="file"> Uploaded file in entity. </param> /// <param name="entity"></param> /// <param name="basePath"></param> /// <param name="folderNameCreator"></param> /// <param name="propertyName"></param> /// <returns> Completed Task </returns> public static async Task <string> SaveFileToPathAsync <TEntity>(this IFormFile file, TEntity entity, string basePath, FilesFolderNameCreator folderNameCreator, string propertyName) { if (file.Length <= 0) { return(""); } //Gets file extension. var fileExtension = Path.GetExtension(file.FileName); //Gets the class name. E.g. If class is ProductDTO then sets the value of this variable as "Product". var folderNameOfClass = folderNameCreator.Invoke(entity.GetType()); //We combined the name of this class (folderNameOfClass) with the path of the basePath folder. So we created the path of the folder belonging to this class. var folderPathOfClass = Path.Combine(basePath, folderNameOfClass); //If there is no such folder in this path (folderPathOfClass), we created it. if (!Directory.Exists(folderPathOfClass)) { Directory.CreateDirectory(folderPathOfClass); } //Since each data belonging to this class (folderNameOfClass) will have a separate folder, we received the Id of the data sent. var folderNameOfItem = CommonHelper.PropertyExists <TEntity>(propertyName) ? entity.GetType().GetProperty(propertyName).GetValue(entity, null).ToString() : throw new MilvaDeveloperException("PropertyNotExists"); //We created the path to the folder of this Id (folderNameOfItem). var folderPathOfItem = Path.Combine(folderPathOfClass, folderNameOfItem); try { //If there is no such folder in this path (folderPathOfItem), we created it. if (!Directory.Exists(folderPathOfItem)) { Directory.CreateDirectory(folderPathOfItem); } else { Directory.Delete(folderPathOfItem, true); Directory.CreateDirectory(folderPathOfItem); } var fileNameWithExtension = $"{folderNameOfItem}{fileExtension}"; var filePathOfItem = Path.Combine(folderPathOfItem, fileNameWithExtension); using (var fileStream = new FileStream(filePathOfItem, FileMode.Create)) { await file.CopyToAsync(fileStream).ConfigureAwait(false); } return(filePathOfItem); } catch (Exception) { Directory.Delete(folderPathOfItem, true); throw; } }
/// <summary> /// Saves uploaded IFormFile files to physical file path. If file list is null or empty returns empty <see cref="List{String}"/> /// Target Path will be : "<paramref name ="basePath"></paramref>/<b><paramref name="folderNameCreator"/>()</b>/<paramref name="entity"></paramref>.<paramref name="propertyName"/>" /// </summary> /// /// <para><b>Remarks:</b></para> /// /// <remarks> /// /// <para> Don't forget validate files with <see cref="ValidateFile(IFormFile, long, List{string}, FileType)"/>, before use this method.</para> /// /// </remarks> /// /// <typeparam name="TEntity"></typeparam> /// <param name="files"> Uploaded file in entity. </param> /// <param name="entity"></param> /// <param name="basePath"></param> /// <param name="folderNameCreator"></param> /// <param name="propertyName"></param> /// <returns> Completed Task </returns> public static async Task <List <string> > SaveFilesToPathAsync <TEntity>(this IFormFileCollection files, TEntity entity, string basePath, FilesFolderNameCreator folderNameCreator, string propertyName) { if (files.IsNullOrEmpty()) { return(new List <string>()); } //Gets file extension. var fileExtension = Path.GetExtension(files[0].FileName); //Gets the class name. E.g. If class is ProductDTO then sets the value of this variable as "Product". var folderNameOfClass = folderNameCreator.Invoke(entity.GetType()); //We combined the name of this class (folderNameOfClass) with the path of the basePath folder. So we created the path of the folder belonging to this class. var folderPathOfClass = Path.Combine(basePath, folderNameOfClass); //Since each data belonging to this class (folderNameOfClass) will have a separate folder, we received the Id of the data sent. var folderNameOfItem = CommonHelper.PropertyExists <TEntity>(propertyName) ? entity.GetType().GetProperty(propertyName).GetValue(entity, null).ToString() : throw new MilvaDeveloperException("PropertyNotExists"); //We created the path to the folder of this Id (folderNameOfItem). var folderPathOfItem = Path.Combine(folderPathOfClass, folderNameOfItem); try { //If there is no such folder in this path (folderPathOfClass), we created it. if (!Directory.Exists(folderPathOfClass)) { Directory.CreateDirectory(folderPathOfClass); } //If there is no such folder in this path (folderPathOfItem), we created it. if (!Directory.Exists(folderPathOfItem)) { Directory.CreateDirectory(folderPathOfItem); } DirectoryInfo directory = new(folderPathOfItem); var directoryFiles = directory.GetFiles(); int markerNo = directoryFiles.IsNullOrEmpty() ? 1 : (directoryFiles.Max(fileInDir => Convert.ToInt32(Path.GetFileNameWithoutExtension(fileInDir.FullName).Split('_')[1])) + 1); var folderPaths = new List <string>(); foreach (var item in files) { var fileNameWithExtension = $"{folderNameOfItem}_{markerNo}{fileExtension}"; var filePathOfItem = Path.Combine(folderPathOfItem, fileNameWithExtension); using (var fileStream = new FileStream(filePathOfItem, FileMode.Create)) { await item.CopyToAsync(fileStream).ConfigureAwait(false); } folderPaths.Add(filePathOfItem); markerNo++; } return(folderPaths); } catch (Exception) { Directory.Delete(folderPathOfClass); Directory.Delete(folderPathOfItem); throw; } }