C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)5 -添加Model类和Controller类,及项目调试

C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)5 -添加Model类和Controller类,及项目调试

1.前言

本文是接:
《C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)1 -环境准备及创建项目》
《C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)2 -获取Word的页数》
《C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)3 -获取PPT和PDF的页数》
《C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)4 -获取Excel的页数》
的第五篇。
由于整个系列介绍得很详细,篇幅较长,所以分成多篇博文进行叙述。个人建议从第一篇博文开始阅读。

2.Model类

2.1 UploadFile的模型

由接口上传上来的文件,无论是Word还是Excel或者PDF,都需要一个公共的模型进行描述。
在本项目中,这个模型需要包含3个属性:

  1. FileName名称
  2. FilePath存储路径
  3. PageNum获取到的文件页数

因此,我在项目中新建“Models”文件夹,然后在下面新建UploadFile.cs的类,如下图:
在这里插入图片描述
代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DocReaderWebAPIDemo.Models
{
    public class UploadFile
    {
        public string FileName { get; set; }

        public string FilePath { get; set; }

        public int PageNum { get; set; }
    }
}

2.2 接口返回的Message的模型

接口返回的信息,统一由Message类进行封装。返回的message需要包含3个属性:

  1. Status表示操作是否成功
  2. Msg表示操作中产生的信息或者异常
  3. Files是UploadFile的对象实例的集合,表示上传并处理了哪些文件

因此,我在项目的“Models”文件夹下,新建Message.cs的类,如下图:
在这里插入图片描述
代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DocReaderWebAPIDemo.Models
{
    public class Message
    {
        //0表示成功;-1表示失败
        public int Status { get; set; }
        //消息
        public string Msg { get; set; }

        public List<UploadFile> Files { get; set; }
    }
}

3.Controller类

控制器类定义了接口请求的路径,接口调用的后台方法,以及需要返回给接口的业务模型信息。
我在这里创建一个统一的ReaderController.cs的控制器,如下图:
在这里插入图片描述
Controller需要继承Microsoft.AspNetCore.Mvc.ControllerBase,然后需要添加“[ApiController]”的属性进行修饰,以表示此Controller用于响应Web API的请求。
然后需要添加“[Route(“GetPageNum”)]”的属性进行修饰,以表示此Controller的路径为“GetPageNum”。
最后要为Controller的方法添加“[HttpPost(“upload”)]”的属性进行修饰,以表示此方法未Post方法,并且请求的子路径为“upload”。

Controller的upload方法需要包含如下功能:

  • 读取请求报文中上传的文件;
  • 筛选符合后缀名限制的文件;
  • 本地新建文件上传的路径,并写文件;
  • 调用Service层的各个Reader,读取文件,获取页数;
  • 删除上传路径中的文件,避免为服务器造成脏数据;
  • 异常捕获;

代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using DocReaderWebAPIDemo.Models;
using DocReaderWebAPIDemo.Service;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace DocReaderWebAPIDemo.Controllers
{
    [Route("GetPageNum")]
    [ApiController]
    public class ReaderController : ControllerBase
    {
        [HttpPost("upload")]
        public Message Upload(IFormCollection Files)
        {
            Message msg = new Message()
            {
                Status = -1,
                Msg = "File not found.",
                Files = new List<UploadFile> { }
            };

            try
            {
                var form = Request.Form;//直接从表单里面获取文件名不需要参数

                IFormFileCollection files = Request.Form.Files;

                foreach (IFormFile file in files)
                {
                    UploadFile uploadFile = new UploadFile();

                    //定义Word文档数组后缀格式
                    string[] limitFileType = { ".pdf", ".doc", ".docx", ".xlsx", ".xls", ".ppt", ".pptx" };
                    //获取file后缀是否存在数组中
                    string currentFileExtension = Path.GetExtension(file.FileName).ToLower();

                    if (!limitFileType.Contains(currentFileExtension))
                    {
                        msg.Status = -1;
                        msg.Msg = "File type is not supported!.";
                    }
                    else
                    {
                        String uploadPath = Path.Combine(Directory.GetCurrentDirectory(), "uploads\\");
                        if (!Directory.Exists(uploadPath))
                        {
                            Directory.CreateDirectory(uploadPath);
                        }
                        String path = Path.Combine(uploadPath, file.FileName);

                        using (var stream = new FileStream(path, FileMode.Create))
                        {
                            //再把文件保存到文件夹中
                            file.CopyTo(stream);

                            stream.Close();
                            stream.Dispose();
                        }

                        uploadFile.FileName = file.FileName;
                        uploadFile.FilePath = path;

                        // 读取Word页数
                        if (currentFileExtension == ".docx" || currentFileExtension == ".doc")
                        {
                            uploadFile.PageNum = WordReader.getWordPageNum(path);
                        }
                        // 读取PDF页数
                        else if (currentFileExtension == ".pdf")
                        {
                            uploadFile.PageNum = PDFReader.getPdfPageNum(path);
                        }
                        // 读取PPT页数
                        else if (currentFileExtension == ".ppt" || currentFileExtension == ".pptx")
                        {
                            uploadFile.PageNum = PPTReader.getPPTPageNum(path);
                        }
                        // 读取Excel页数
                        else if (currentFileExtension == ".xls" || currentFileExtension == ".xlsx")
                        {
                            uploadFile.PageNum = ExcelReader.getExcelPageNum(path);
                        }

                        System.IO.File.Delete(path);
                        msg.Status = 0;
                        msg.Msg = "Success.";
                        msg.Files.Add(uploadFile);
                    }
                }
            }
            catch (Exception e)
            {
                msg.Status = -1;
                msg.Msg = e.Message;
            }
            return msg;
        }
    }
}

至此,项目所有需要写的代码都结束了。

4.调试项目

我使用Postman工具进行接口调用。
首先,要关闭Postman的“SSL证书验证”功能,如下图:
在这里插入图片描述
然后在VS中执行Debug调试,如下图:
在这里插入图片描述
如果一切正常,则会在VS控制台中显示服务的地址和端口号,如下图:
在这里插入图片描述
最后回到Postman,调用下接口试试,如下图:
在这里插入图片描述
点击发送,等待响应,如下图:
在这里插入图片描述
Nice!成功了!
在这里插入图片描述
当然,读者朋友运行到这里可能会出现各种各样的异常问题,我会在后续的博文中进行介绍(因为我也是踩着坑过来的~~~)

5.后记

下一篇:
《C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)6 -将项目部署到IIS,及常见错误解决方案》

发布了42 篇原创文章 · 获赞 15 · 访问量 9768

猜你喜欢

转载自blog.csdn.net/weixin_40326608/article/details/102701916
今日推荐