Thumbnail: async operations. Changed thumbnails format requested from editors to jpg. 1879 issue

This commit is contained in:
pavelbannov 2022-03-28 11:38:50 +03:00
parent e61a45436d
commit 9264302ec4
4 changed files with 40 additions and 38 deletions

View File

@ -131,7 +131,7 @@ namespace ASC.Web.Files.Classes
CustomNamingPeople = customNamingPeople;
FileSecurityCommon = fileSecurityCommon;
ThumbnailExtension = configuration["files:thumbnail:exts"] ?? "png";
ThumbnailExtension = configuration["files:thumbnail:exts"] ?? "jpg";
}
#region Property

View File

@ -38,8 +38,8 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Formats.Png;
namespace ASC.Files.ThumbnailBuilder
{
[Singletone]
@ -56,21 +56,21 @@ namespace ASC.Files.ThumbnailBuilder
config = settings;
}
public void BuildThumbnails(IEnumerable<FileData<T>> filesWithoutThumbnails)
public async Task BuildThumbnails(IEnumerable<FileData<T>> filesWithoutThumbnails)
{
try
{
Parallel.ForEach(
await Parallel.ForEachAsync(
filesWithoutThumbnails,
new ParallelOptions { MaxDegreeOfParallelism = config.MaxDegreeOfParallelism },
(fileData) =>
async (fileData, token) =>
{
using var scope = ServiceProvider.CreateScope();
var commonLinkUtilitySettings = scope.ServiceProvider.GetService<CommonLinkUtilitySettings>();
commonLinkUtilitySettings.ServerUri = fileData.BaseUri;
var builder = scope.ServiceProvider.GetService<Builder<T>>();
builder.BuildThumbnail(fileData);
await builder.BuildThumbnail(fileData);
}
);
}
@ -117,7 +117,7 @@ namespace ASC.Files.ThumbnailBuilder
ClientFactory = clientFactory;
}
internal void BuildThumbnail(FileData<T> fileData)
internal async Task BuildThumbnail(FileData<T> fileData)
{
try
{
@ -130,7 +130,7 @@ namespace ASC.Files.ThumbnailBuilder
return;
}
GenerateThumbnail(fileDao, fileData);
await GenerateThumbnail(fileDao, fileData);
}
catch (Exception exception)
{
@ -142,13 +142,13 @@ namespace ASC.Files.ThumbnailBuilder
}
}
private void GenerateThumbnail(IFileDao<T> fileDao, FileData<T> fileData)
private async Task GenerateThumbnail(IFileDao<T> fileDao, FileData<T> fileData)
{
File<T> file = null;
try
{
file = fileDao.GetFileAsync(fileData.FileId).Result;
file = await fileDao.GetFileAsync(fileData.FileId);
if (file == null)
{
@ -167,17 +167,17 @@ namespace ASC.Files.ThumbnailBuilder
if (!config.FormatsArray.Contains(ext) || file.Encrypted || file.RootFolderType == FolderType.TRASH || file.ContentLength > config.AvailableFileSize)
{
file.ThumbnailStatus = Thumbnail.NotRequired;
fileDao.SaveThumbnailAsync(file, null).Wait();
await fileDao.SaveThumbnailAsync(file, null);
return;
}
if (IsImage(file))
{
CropImage(fileDao, file);
await CropImage(fileDao, file);
}
else
{
MakeThumbnail(fileDao, file);
await MakeThumbnail(fileDao, file);
}
}
catch (Exception exception)
@ -186,12 +186,12 @@ namespace ASC.Files.ThumbnailBuilder
if (file != null)
{
file.ThumbnailStatus = Thumbnail.Error;
fileDao.SaveThumbnailAsync(file, null).Wait();
await fileDao.SaveThumbnailAsync(file, null);
}
}
}
private void MakeThumbnail(IFileDao<T> fileDao, File<T> file)
private async Task MakeThumbnail(IFileDao<T> fileDao, File<T> file)
{
logger.DebugFormat("MakeThumbnail: FileId: {0}.", file.ID);
@ -201,8 +201,11 @@ namespace ASC.Files.ThumbnailBuilder
do
{
try
{
if (GetThumbnailUrl(file, Global.ThumbnailExtension, out thumbnailUrl))
{
var (result, url) = await GetThumbnailUrl(file, Global.ThumbnailExtension);
thumbnailUrl = url;
if (result)
{
break;
}
@ -240,10 +243,10 @@ namespace ASC.Files.ThumbnailBuilder
}
while (string.IsNullOrEmpty(thumbnailUrl));
SaveThumbnail(fileDao, file, thumbnailUrl);
await SaveThumbnail(fileDao, file, thumbnailUrl);
}
private bool GetThumbnailUrl(File<T> file, string toExtension, out string url)
private async Task<(bool, string)> GetThumbnailUrl(File<T> file, string toExtension)
{
var fileUri = PathProvider.GetFileStreamUrl(file);
fileUri = DocumentServiceConnector.ReplaceCommunityAdress(fileUri);
@ -279,24 +282,24 @@ namespace ASC.Files.ThumbnailBuilder
}
};
(var operationResultProgress, url) = DocumentServiceConnector.GetConvertedUriAsync(fileUri, fileExtension, toExtension, docKey, null, thumbnail, spreadsheetLayout, false).Result;
var (operationResultProgress, url) = await DocumentServiceConnector.GetConvertedUriAsync(fileUri, fileExtension, toExtension, docKey, null, thumbnail, spreadsheetLayout, false);
operationResultProgress = Math.Min(operationResultProgress, 100);
return operationResultProgress == 100;
return (operationResultProgress == 100, url);
}
private void SaveThumbnail(IFileDao<T> fileDao, File<T> file, string thumbnailUrl)
private async Task SaveThumbnail(IFileDao<T> fileDao, File<T> file, string thumbnailUrl)
{
logger.DebugFormat("SaveThumbnail: FileId: {0}. ThumbnailUrl {1}.", file.ID, thumbnailUrl);
var request = new HttpRequestMessage();
using var request = new HttpRequestMessage();
request.RequestUri = new Uri(thumbnailUrl);
var httpClient = ClientFactory.CreateClient();
using var response = httpClient.Send(request);
using (var stream = new ResponseStream(response))
{
Crop(fileDao, file, stream);
await Crop(fileDao, file, stream);
}
logger.DebugFormat("SaveThumbnail: FileId: {0}. Successfully saved.", file.ID);
@ -308,28 +311,29 @@ namespace ASC.Files.ThumbnailBuilder
return FileUtility.ExtsImage.Contains(extension);
}
private void CropImage(IFileDao<T> fileDao, File<T> file)
private async Task CropImage(IFileDao<T> fileDao, File<T> file)
{
logger.DebugFormat("CropImage: FileId: {0}.", file.ID);
using (var stream = fileDao.GetFileStreamAsync(file).Result)
using (var stream = await fileDao.GetFileStreamAsync(file))
{
Crop(fileDao, file, stream);
await Crop(fileDao, file, stream);
}
logger.DebugFormat("CropImage: FileId: {0}. Successfully saved.", file.ID);
}
private void Crop(IFileDao<T> fileDao, File<T> file, Stream stream)
private async Task Crop(IFileDao<T> fileDao, File<T> file, Stream stream)
{
using (var sourceImg = Image.Load(stream))
{
using (var targetImg = GetImageThumbnail(sourceImg))
{
using (var targetStream = new MemoryStream())
{
{
targetImg.Save(targetStream, PngFormat.Instance);
fileDao.SaveThumbnailAsync(file, targetStream).Wait();
//targetImg.Save(targetStream, JpegFormat.Instance);
await fileDao.SaveThumbnailAsync(file, targetStream);
}
}
}

View File

@ -64,7 +64,7 @@ namespace ASC.Files.ThumbnailBuilder
}
private void Procedure(object _)
private async void Procedure(object _)
{
timer.Change(Timeout.Infinite, Timeout.Infinite);
logger.Trace("Procedure: Start.");
@ -98,7 +98,7 @@ namespace ASC.Files.ThumbnailBuilder
.OrderByDescending(fileData => Array.IndexOf(premiumTenants, fileData.TenantId))
.ToList();
builder.BuildThumbnails(filesWithoutThumbnails);
await builder.BuildThumbnails(filesWithoutThumbnails);
}
logger.Trace("Procedure: Finish.");

View File

@ -75,10 +75,9 @@ namespace ASC.Web.Core.Users
public static Image GetImage(Image mainImg, Size size, UserPhotoThumbnailSettings thumbnailSettings)
{
var x = thumbnailSettings.Point.X > 0 ? thumbnailSettings.Point.X : 0;
var y = thumbnailSettings.Point.Y > 0 ? thumbnailSettings.Point.Y : 0;
var width = x + thumbnailSettings.Size.Width > mainImg.Width ? mainImg.Width : thumbnailSettings.Size.Width;
var width = x + thumbnailSettings.Size.Width > mainImg.Width ? mainImg.Width : thumbnailSettings.Size.Width;
var height = y + thumbnailSettings.Size.Height > mainImg.Height ? mainImg.Height : thumbnailSettings.Size.Height;
var rect = new Rectangle(x,
@ -86,10 +85,9 @@ namespace ASC.Web.Core.Users
width,
height);
Image destRound = mainImg.Clone(x => x.Crop(rect).Resize(new ResizeOptions
var destRound = mainImg.Clone(x => x.Crop(rect).Resize(new ResizeOptions
{
Size = size,
Mode = ResizeMode.Stretch
Size = size
}));
return destRound;