138 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
using IRaCIS.Core.Application.Helper;
 | 
						||
using MassTransit;
 | 
						||
using Microsoft.AspNetCore.Authorization;
 | 
						||
using Microsoft.AspNetCore.Builder;
 | 
						||
using Microsoft.AspNetCore.Hosting;
 | 
						||
using Microsoft.AspNetCore.Http;
 | 
						||
using Microsoft.AspNetCore.Mvc;
 | 
						||
using Microsoft.AspNetCore.StaticFiles;
 | 
						||
using RestSharp;
 | 
						||
using SharpCompress.Common;
 | 
						||
using System;
 | 
						||
using System.Collections.Generic;
 | 
						||
using System.Linq;
 | 
						||
using System.Text;
 | 
						||
using System.Threading.Tasks;
 | 
						||
 | 
						||
namespace IRaCIS.Core.Application.Service.MinimalApiService
 | 
						||
{
 | 
						||
    /// <summary>
 | 
						||
    /// 上传文件转PDF 或者给url 这边下载然后转PDF
 | 
						||
    /// 
 | 
						||
    /// </summary>
 | 
						||
    /// <param name="_hostEnvironment"></param>
 | 
						||
    [ApiExplorerSettings(GroupName = "Institution")]
 | 
						||
    public class FileToPDFService(IWebHostEnvironment _hostEnvironment) : ServiceBase
 | 
						||
    {
 | 
						||
 | 
						||
        [AllowAnonymous]
 | 
						||
        [RoutePattern(HttpMethod = "Post")]
 | 
						||
        public async Task<IResult> UploadFileAsync([FromForm] IFormFile file)
 | 
						||
        {
 | 
						||
            var tempFileName = NewId.NextGuid() + file.FileName;
 | 
						||
            var tempPDFName = Path.GetFileNameWithoutExtension(tempFileName) + ".pdf";
 | 
						||
 | 
						||
 | 
						||
            // 获取wwwroot目录
 | 
						||
            var wwwRootPath = Path.Combine(FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment), "temp");
 | 
						||
 | 
						||
            // 检查wwwroot/temp目录是否存在,不存在则创建
 | 
						||
            if (!Directory.Exists(wwwRootPath))
 | 
						||
            {
 | 
						||
                Directory.CreateDirectory(wwwRootPath);
 | 
						||
            }
 | 
						||
 | 
						||
            // 文件保存路径
 | 
						||
            var pdfFilePath = Path.Combine(wwwRootPath, tempPDFName);
 | 
						||
            var tempFilePath = Path.Combine(wwwRootPath, tempFileName);
 | 
						||
 | 
						||
 | 
						||
            using var stream = File.OpenWrite(tempFilePath);
 | 
						||
            await file.CopyToAsync(stream);
 | 
						||
 | 
						||
            FileConvertHelper.ConvertWordToPdf(tempFilePath, Path.GetDirectoryName(pdfFilePath));
 | 
						||
 | 
						||
            var fileBytes = await File.ReadAllBytesAsync(pdfFilePath);
 | 
						||
 | 
						||
            // 清理临时上传的文件和pdf
 | 
						||
            if (File.Exists(pdfFilePath))
 | 
						||
            {
 | 
						||
                File.Delete(pdfFilePath);
 | 
						||
            }
 | 
						||
            if (File.Exists(tempFilePath))
 | 
						||
            {
 | 
						||
                File.Delete(tempFilePath);
 | 
						||
            }
 | 
						||
 | 
						||
            new FileExtensionContentTypeProvider().Mappings.TryGetValue(Path.GetExtension(tempPDFName), out var contentType);
 | 
						||
 | 
						||
            return Results.File(fileBytes, contentType);
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        public async Task<IResult> GetPDFFileAsync(string fileUrl)
 | 
						||
        {
 | 
						||
            var tempFileName = NewId.NextGuid() + Path.GetFileName(fileUrl);
 | 
						||
            var tempPDFName = Path.GetFileNameWithoutExtension(tempFileName) + ".pdf";
 | 
						||
 | 
						||
 | 
						||
            // 获取wwwroot目录
 | 
						||
            var wwwRootPath = Path.Combine(FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment), "temp");
 | 
						||
 | 
						||
            // 检查wwwroot/temp目录是否存在,不存在则创建
 | 
						||
            if (!Directory.Exists(wwwRootPath))
 | 
						||
            {
 | 
						||
                Directory.CreateDirectory(wwwRootPath);
 | 
						||
            }
 | 
						||
 | 
						||
            // 文件保存路径
 | 
						||
            var pdfFilePath = Path.Combine(wwwRootPath, tempPDFName);
 | 
						||
            var tempFilePath = Path.Combine(wwwRootPath, tempFileName);
 | 
						||
 | 
						||
 | 
						||
            //请求url获取文件
 | 
						||
            var client = new RestClient(fileUrl);
 | 
						||
 | 
						||
            var request = new RestRequest(fileUrl, Method.Get);
 | 
						||
 | 
						||
            var response = await client.ExecuteAsync(request);
 | 
						||
 | 
						||
            // 检查响应是否成功
 | 
						||
            if (response.IsSuccessful)
 | 
						||
            {
 | 
						||
                // 将响应内容写入到本地文件
 | 
						||
                await File.WriteAllBytesAsync(tempFilePath, response.RawBytes);
 | 
						||
 | 
						||
                FileConvertHelper.ConvertWordToPdf(tempFilePath, Path.GetDirectoryName(pdfFilePath));
 | 
						||
 | 
						||
                var fileBytes = await File.ReadAllBytesAsync(pdfFilePath);
 | 
						||
 | 
						||
                // 清理临时上传的文件和pdf
 | 
						||
                if (File.Exists(pdfFilePath))
 | 
						||
                {
 | 
						||
                    File.Delete(pdfFilePath);
 | 
						||
                }
 | 
						||
                if (File.Exists(tempFilePath))
 | 
						||
                {
 | 
						||
                    File.Delete(tempFilePath);
 | 
						||
                }
 | 
						||
 | 
						||
                new FileExtensionContentTypeProvider().Mappings.TryGetValue(Path.GetExtension(tempPDFName), out var contentType);
 | 
						||
 | 
						||
                return Results.File(fileBytes, contentType);
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                Console.WriteLine($"下载文件失败: {response.ErrorMessage}");
 | 
						||
 | 
						||
                return Results.Problem("下载文件失败", statusCode: StatusCodes.Status500InternalServerError);
 | 
						||
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
    }
 | 
						||
}
 |