public async Task <ActionResult <CommentResponse> > UploadCaffAsync(IFormFile file, [FromRoute] string name, [FromRoute] string price) { var request = new UploadCAFFRequest { Image = file, Name = name, Price = double.Parse(price, CultureInfo.InvariantCulture) }; var caff = await _caffService.Upload(User.UserId(), request); var response = _mapper.Map <CAFFResponse>(caff); // Add baseurl var baseUrl = $"{Request.Scheme}://{Request.Host}/"; response.ImageUrl = baseUrl + response.ImageUrl; response.ThumbnailUrl = baseUrl + response.ThumbnailUrl; return(Ok(response)); }
public async Task <Caff> Upload(long userId, UploadCAFFRequest request) { // TODO What to do with userId? var ext = Path.GetExtension(request.Image.FileName).ToLowerInvariant(); if (string.IsNullOrEmpty(ext) || !permittedExtensions.Contains(ext)) { throw new BadRequestException("Not supported file extension"); } if (request.Image.Length > _fileSettings.MaxSizeInMegaBytes * 1024 * 1024) { throw new BadRequestException("Size limit reached"); } var extension = ".caff"; Directory.CreateDirectory(_fileSettings.FilePath); var filePath = Path.Combine(_fileSettings.FilePath, Path.GetRandomFileName() + extension); using (var stream = File.Create(filePath)) { await request.Image.CopyToAsync(stream); } var directory = filePath.Substring(0, filePath.Length - extension.Length); Directory.CreateDirectory(directory); string creator; DateTime creationDate; int duration = 0; string thumbnail = Path.Combine(directory, "1_img.bmp"); try { var process = System.Diagnostics.Process.Start(_parserSettings.ParserExe, $"{filePath} {directory}"); process.WaitForExit(); var metadataJsonFile = Path.Combine(directory, "output.json"); if (!File.Exists(metadataJsonFile)) { throw new Exception("CAFF parsing did not produce metadata"); } if (!File.Exists(thumbnail)) { throw new Exception("CAFF parsing did not produce thumbnail image"); } var jsonContent = File.ReadAllText(metadataJsonFile); dynamic jToken = JToken.Parse(jsonContent); var year = jToken.Credits.year.ToObject <int>(); var month = jToken.Credits.month.ToObject <int>(); var day = jToken.Credits.day.ToObject <int>(); var hour = jToken.Credits.hour.ToObject <int>(); var minute = jToken.Credits.minute.ToObject <int>(); creator = jToken.Credits.creator; creationDate = new DateTime( year, month, day, hour, minute, 0 ); foreach (var anim in jToken.Animations) { duration += anim.duration.ToObject <int>(); } } catch { Directory.Delete(directory); throw; } var thumbnails = new List <Thumbnail>(); foreach (var file in Directory.GetFiles(directory, "*.bmp")) { thumbnails.Add(new Thumbnail { FilePath = file }); } var caff = new Caff { Name = request.Name, Cost = request.Price, ImagePath = filePath, Creator = creator, CreationDate = creationDate, Duration = duration, Thumbnails = thumbnails }; return(await Create(caff)); }