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个属性:
- FileName名称
- FilePath存储路径
- 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个属性:
- Status表示操作是否成功
- Msg表示操作中产生的信息或者异常
- 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,及常见错误解决方案》