Thumbnail: async operations. Changed thumbnails format requested from editors to jpg. 1879 issue
This commit is contained in:
parent
e61a45436d
commit
9264302ec4
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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.");
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user