/// <summary> /// 上传至文件服务器 /// </summary> private async Task <SimplyResult <Guid> > UploadFileServerAsync(byte[] fileBytes, string fileExt = null) { var fileId = SequentialGuid.NewGuid(); var file = new { FileId = fileId, FileName = string.IsNullOrEmpty(fileExt) ? fileId.ToString() : $"{fileId}.{fileExt}", Data = fileBytes }; try { var httpClient = m_HttpClientFactory.CreateClient("FileClient"); var response = await httpClient.PostAsJsonAsync("file/upload", file); response.EnsureSuccessStatusCode(); var responseBody = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject <WebApiResponse>(responseBody); if (!result.Success) { throw new Exception(result.Error.Description); } return(SimplyResult.Ok(fileId)); } catch (Exception ex) { m_Logger.LogError(ex, "上传文件失败"); return(SimplyResult.Fail(nameof(Errors.RequestFileAPIFail), Errors.RequestFileAPIFail, Guid.Empty)); } }
/// <summary> /// 保存录音文件 /// </summary> /// <param name="callRecord"></param> /// <param name="fileName"></param> /// <param name="amrBytes"></param> /// <returns></returns> public async Task <SimplyResult <Guid> > SaveFileAsync(CallRecord callRecord, string fileName, byte[] amrBytes) { Requires.NotNull(callRecord, nameof(callRecord)); Requires.NotNullOrEmpty(fileName, nameof(fileName)); if (!amrBytes?.Any() ?? true) { return(SimplyResult.Fail(nameof(Errors.EmptyFile), Errors.EmptyFile, Guid.Empty)); } var amrName = $"{callRecord.Id}_{fileName}"; var mp3Name = $"{callRecord.Id}.mp3"; var amrPath = Path.Combine(Paths.FFmpegFolder, amrName); var mp3Path = Path.Combine(Paths.FFmpegFolder, mp3Name); await File.WriteAllBytesAsync(amrPath, amrBytes); m_FFmpeg.Instance.Convert(amrName, mp3Name); if (File.Exists(mp3Path)) { var mp3Bytes = await File.ReadAllBytesAsync(mp3Path); if (mp3Bytes?.Any() ?? false) { return(await UploadFileServerAsync(mp3Bytes, "mp3")); } } return(SimplyResult.Fail(nameof(Errors.ConvertFileError), Errors.ConvertFileError, Guid.Empty)); }
public override async Task <SimplyResult <DocConvertResultDto> > GenerateAsync(OSSObjectDto ossObjectDto, bool isRegenerate) { Requires.NotNull(ossObjectDto, nameof(ossObjectDto)); var token = await GetTokenAsync(ossObjectDto.Bucket, ossObjectDto.FilePath, ossObjectDto.HashPath, isRegenerate); var generateResult = new DocConvertResultDto { PreviewUrl = GetPreviewUrl(ossObjectDto.Bucket, ossObjectDto.FilePath, token), Status = DocConvertStatus.Finished, FileType = ossObjectDto.FileType }; return(SimplyResult.Ok(generateResult)); }
public virtual async Task <SimplyResult <DocConvertResultDto> > GenerateAsync(OSSObjectDto ossObjectDto, bool isRegenerate) { Requires.NotNull(ossObjectDto, nameof(ossObjectDto)); var generateResult = await m_PreviewRedisService.GetAsync(ossObjectDto.HashPath); if ((generateResult?.ETag ?? string.Empty) != ossObjectDto.ETag) { isRegenerate = true; } if (isRegenerate) { generateResult = m_PreviewSetting.IsSyncConvert ? m_IMMService.Convert(ossObjectDto) : m_IMMService.CreateConvertTask(ossObjectDto); } if (generateResult?.Status == DocConvertStatus.Running && m_PreviewSetting.TaskPollingSpend > 0) { generateResult = await QueryConvertTaskAsync(generateResult.TaskId); } switch (generateResult?.Status) { case DocConvertStatus.Running: case DocConvertStatus.Finished: generateResult.PreviewUrl = m_IMMSetting.GetPreviewUrl(ossObjectDto.IMMKey); generateResult.FileType = ossObjectDto.FileType; await m_PreviewRedisService.SetAsync(ossObjectDto.HashPath, generateResult); var token = await GetTokenAsync(m_IMMSetting.Bucket, $"{m_IMMSetting.GetPrefix(ossObjectDto.IMMKey)}/*", ossObjectDto.HashPath, isRegenerate); generateResult.PreviewUrl = GetFullPreviewUrl(generateResult.PreviewUrl, token); return(SimplyResult.Ok(generateResult)); default: await m_PreviewRedisService.DeleteAsync(ossObjectDto.HashPath); return(SimplyResult.Fail <DocConvertResultDto>("GenerateFail", "文档转换失败")); } }
public virtual SimplyResult <OSSObjectDto> GetOSSObject(string ossPath) { Requires.NotNullOrEmpty(ossPath, nameof(ossPath)); var ossObject = new OSSObjectDto(ossPath); var ossObjectMetadata = m_OSSService.GetObjectMetadata(ossObject.Bucket, ossObject.FilePath); if (ossObjectMetadata == null) { return(SimplyResult.Fail <OSSObjectDto>("FileNoExist", "文档不存在")); } var ossFileType = string.Empty; if (!string.IsNullOrEmpty(ossObjectMetadata.ContentDisposition)) { var fileName = Regexs.ContentDispositionFileNameRegex.Match(ossObjectMetadata.ContentDisposition).Value; ossFileType = Path.GetExtension(fileName).TrimStart('.'); } if (string.IsNullOrEmpty(ossFileType)) { Resources.ContentTypeDict.TryGetValue(ossObjectMetadata.ContentType.Split(';')[0].ToLower(), out ossFileType); } if (string.IsNullOrEmpty(ossFileType) || !Resources.IMMFileTypeDict.TryGetValue(ossFileType, out var immFileType)) { return(SimplyResult.Fail <OSSObjectDto>("UnsupportedFile", "不支持的文件类型")); } ossObject.FileType = immFileType; ossObject.ETag = ossObjectMetadata.ETag; return(SimplyResult.Ok(ossObject)); }
protected JsonResult Json(SimplyResult result) { return(result.IsSuccess ? Json(WebApiResponse.Ok()) : Json(result.ErrorCode, result.ErrorMessage)); }
protected JsonResult Json <T>(SimplyResult <T> result) { return(result.IsSuccess ? Json(WebApiResponse.Ok(result.Data)) : Json(result.ErrorCode, result.ErrorMessage, result.Data)); }
protected JsonResult Json <T>(SimplyResult <T> result) { return(result.IsSuccess ? Ok(result.Data) : Fail(result.ErrorCode, result.ErrorMessage, result.Data)); }