public async Task <ActionResult> Upload(MediaUploadRequestVM vm, IFormFile file) { try { var result = await _media.UploadAsync(vm, file, User); result.ThumbnailPath = Url.Content(result.ThumbnailPath); await _db.SaveChangesAsync(); if (!result.IsProcessed) { _workerAlarm.FireNewEncoderJob(); } return(Json(result)); } catch (Exception ex) { return(Json(new { Error = true, Description = ex.Message })); } }
/// <summary> /// Uploads a new media file. /// </summary> public async Task <MediaUploadResultVM> UploadAsync(MediaUploadRequestVM vm, IFormFile file, ClaimsPrincipal principal) { var id = Guid.NewGuid(); var key = PageHelper.GetMediaKey(id); var handler = _mediaHandlers.FirstOrDefault(x => x.SupportedMimeTypes.Contains(file.ContentType)); if (handler == null) { throw new UploadException("Неизвестный тип файла!"); } var userId = _userMgr.GetUserId(principal); var user = await _db.Users.GetAsync(x => x.Id == userId, "Пользователь не найден"); var paths = await SaveUploadAsync(file, key, handler); var tags = await GetTagsForUploadedMedia(vm); var meta = await handler.ExtractMetadataAsync(paths.LocalPath, file.ContentType); var media = new Media { Id = id, Key = key, Type = handler.MediaType, MimeType = file.ContentType, Title = vm.Title, FilePath = paths.UrlPath, UploadDate = DateTimeOffset.Now, Uploader = user, IsProcessed = handler.IsImmediate, Date = FuzzyDate.TryParse(vm.Date) != null ? vm.Date : meta?.Date?.Date.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture), Tags = tags }; _db.Media.Add(media); if (!handler.IsImmediate) { _db.MediaJobs.Add(new MediaEncodingJob { Id = Guid.NewGuid(), MediaId = media.Id }); } var changeset = await GetChangesetAsync(null, _mapper.Map <MediaEditorVM>(media), id, principal, null); _db.Changes.Add(changeset); return(_mapper.Map <MediaUploadResultVM>(media)); }
/// <summary> /// Creates event \ location tags for the uploaded media. /// </summary> private async Task <List <MediaTag> > GetTagsForUploadedMedia(MediaUploadRequestVM vm) { var result = new List <MediaTag>(); var locId = vm.Location.TryParse <Guid>(); var evtId = vm.Event.TryParse <Guid>(); var tagIds = new[] { locId, evtId } .Where(x => x != Guid.Empty) .ToList(); var existing = tagIds.Any() ? await _db.Pages .Where(x => tagIds.Contains(x.Id) && !x.IsDeleted) .ToHashSetAsync(x => x.Id) : null; TryAddTag(vm.Location, locId, MediaTagType.Location); TryAddTag(vm.Event, evtId, MediaTagType.Event); return(result); void TryAddTag(string title, Guid id, MediaTagType type) { if (string.IsNullOrEmpty(title)) { return; } var tag = new MediaTag { Type = type }; if (existing?.Contains(id) == true) { tag.ObjectId = id; } else { tag.ObjectTitle = title; } result.Add(tag); } }