上传附件判断word、excel、txt等文档中是否含有敏感词如身份证号,手机号等,其它检测如PDF,图片(OCR)等可以自行扩展。

互联网项目中,展示的数据中不能包含个人信息等敏感信息。判断word中是否包含手机号,word正文中是否包含身份证号等敏感信息,通过正则表达式判断匹配手机号,身份证号,以下做为参考。会出现碰撞错误,碰撞不准确等情况,不在本文范围。

开发语言C#,框架asp.net webform。由于传文件是做的判断,所以这里是判断数据流HttpPostedFile postedFile中的内容。通过load本地文件,本文不做过多介绍。

一、word校验身份证号,手机号

获取word中内容最初用的是npoi插件,office的插件导入导出以前用的比较多,npoi只获取docx文档文本,npoi获取doc后缀有问题,又找的Spire.Doc。可以都使用后者,笔者只简单测试了doc后缀,其它复杂情况没具体测试。有时间的推荐Spire,因为附件中pdf也是一个大项,刚好有对应的using Spire.Pdf;

using NPOI.XWPF.UserModel;
using Spire.Doc;
using Spire.Doc.Documents;

 public class WordToTextConvert
{
/// <summary>
/// docx提取成纯文本
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static string ExtractTextFromWord(Stream wordFileStream,string fileExt)
{
using (wordFileStream)
{
XWPFDocument doc = new XWPFDocument(wordFileStream); using (StringWriter writer = new StringWriter())
{
string text = "";
foreach (var para in doc.Paragraphs)
{
text += para.Text+" ";
} foreach (XWPFTable table in doc.Tables)
{
foreach (XWPFTableRow row in table.Rows)
{
foreach (XWPFTableCell cell in row.GetTableCells())
{
text += cell.GetText() + " ";
}
}
text += "\r\n";
}
return text;
}
}
}
/// <summary>
/// doc后缀
/// </summary>
/// <param name="wordFileStream"></param>
/// <param name="fileExt"></param>
/// <returns></returns>
public static string ExtractTextFromWordDoc(Stream wordFileStream, string fileExt)
{
Spire.Doc.Document doc = new Spire.Doc.Document(wordFileStream);
Spire.Doc.Table table = doc.Sections[0].Tables[0] as Table;
string text = doc.GetText()+" ";//获取word文档中的文本
//纯表格可以使用以下方法
//遍历表格内容
for (int i = 0; i < table.Rows.Count; i++)
{
var cellsindex = table.Rows[i].Cells.Count;
for (int j = 0; j < cellsindex; j++)
{
TableCell cell = table.Rows[i].Cells[j];
foreach (Paragraph paragraph in cell.Paragraphs)
{
text += paragraph.Text+" ";
}
} text += "\r\n";
}
return text;
}
}

二、EXCEL校验校验身份证号,手机号

npoi处理excel时要判断后缀,xls和xlsx使用的类不同

public class ExcelToTextConvert
{
/// <summary>
/// 提取成纯文本
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static string ExtractTextFromExcel(Stream excelFileStream,string fileExt)
{
using (excelFileStream)
{
string text = ""; IWorkbook workbook=null;
if (fileExt == "xls")
{
workbook = new HSSFWorkbook(excelFileStream);
}
if (fileExt == "xlsx")
{
workbook = new XSSFWorkbook(excelFileStream);
}
ISheet sheet = workbook.GetSheetAt(0);
if (sheet != null)
{
foreach (IRow row in sheet)
{
foreach (ICell cell in row)
{
switch (cell.CellType)
{
case CellType.String:
text += cell.StringCellValue + " ";
break;
case CellType.Numeric:
text += cell.NumericCellValue + " ";
break;
}
}
text += "\r\n";
}
}
return text;
}
}
}

三、txt校验校验身份证号,手机号

获取文件流的内容,文本文件可以直接读取。方法如下:

if ("txt".Contains(fileExt))
{
// 确保文件不为null并且有数据
if (postedFile != null && postedFile.ContentLength > 0)
{
using (StreamReader reader = new StreamReader(postedFile.InputStream))
{
// 读取文件内容并返回
string readContent = reader.ReadToEnd();
bool hasMobile = ContainsMobileNumber(readContent);
if (hasMobile)
{
return "{\"status\": 0, \"msg\": \"内容中不可含有手机号!\"}";
}
bool hasId = ContainsIdNumber(readContent);
if (hasId)
{
return "{\"status\": 0, \"msg\": \"内容中不可含有身份证号!\"}";
}
}
}
}

、正则校验字符串中是否包含身份证号,手机号等

public static bool ContainsMobileNumber(string text)
{
// 中国大陆手机号码正则表达式
string pattern = @"1[3-9]\d{9}";
return Regex.IsMatch(text, pattern);
} public static bool ContainsIdNumber(string text)
{
// 中国大陆身份证号正则表达式
string pattern = @"[1-9]\d{5}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])";
return Regex.IsMatch(text, pattern);
}

五、读取pdf方法,未做项目验证,请自行搜索相关方法

供参考:读取显示PDF需要借助PDF库,国内Spire.PDF可以读取PDF内容,包括文本,图片以及表格,你可以通过NuGet搜索安装

  1 using Spire.Pdf;
2 using Spire.Pdf.Texts;
3 using System.IO;
4
5 using System.Text;
6
7 namespace ExtractText
8
9 {
10
11 internal class Program
12
13 {
14
15 static void Main(string[] args)
16
17 {
18
19 //创建一个 PdfDocument 对象
20
21 PdfDocument doc = new PdfDocument();
22 //加载PDF文件
23
24 doc.LoadFromFile("AI数字人.pdf");
25
26 StringBuilder sb = new StringBuilder();
27
28 foreach (PdfPageBase page in doc.Pages)
29
30 {
31
32 //创建一个PdfTextExtractot 对象
33
34 PdfTextExtractor textExtractor = new PdfTextExtractor(page);
35
36 //创建一个 PdfTextExtractOptions 对象
37
38 PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();
39
40 //将 isExtractAllText 设置为true
41
42 extractOptions.IsExtractAllText = true;
43
44 //从页面中提取文本
45
46 sb.AppendLine(textExtractor.ExtractText(extractOptions));
47
48 }
49
50 //将提取的文本写入 TXT 文件
51
52 File.WriteAllText("提取指定页面文本.txt", sb.ToString());
53
54 }
55
56 }
57
58 }
59
60 读取表格内容:
61
62 using Spire.Pdf;
63
64 using Spire.Pdf.Utilities;
65
66 using System.IO;
67
68 using System.Text;
69
70 namespace ExtractTable{
71 class Program
72 {
73 static void Main(string[] args)
74 {
75 //实例化PdfDocument类的对象
76 PdfDocument pdf = new PdfDocument();
77 //加载PDF文档
78 pdf.LoadFromFile("sample.pdf");
79 //创建StringBuilder类的对象
80 StringBuilder builder = new StringBuilder();
81 //实例化PdfTableExtractor类的对象
82 PdfTableExtractor extractor = new PdfTableExtractor(pdf);
83 //声明PdfTable类的表格数组
84 PdfTable[] tableLists;
85 //遍历PDF页面
86 for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
87 {
88 //从页面提取表格
89 tableLists = extractor.ExtractTable(pageIndex);
90 //判断表格列表是否为空
91 if (tableLists != null && tableLists.Length > 0)
92 {
93 //遍历表格
94 foreach (PdfTable table in tableLists)
95 {
96 //获取表格中的行和列数
97 int row = table.GetRowCount();
98 int column = table.GetColumnCount();
99 //遍历表格行和列
100 for (int i = 0; i < row; i++)
101 {
102 for (int j = 0; j < column; j++)
103 {
104 //获取行和列中的文本
105 string text = table.GetText(i, j);
106 //写入文本到StringBuilder容器
107 builder.Append(text + " ");
108 }
109 builder.Append("\r\n");
110 }
111 }
112 }
113 }
114 //保存提取的表格内容为.txt文档
115 File.WriteAllText("ExtractedTable.txt", builder.ToString());
116 }
117 }
118
119 }

读取PDF的内容,文本、表格、图片

总结:尽一切合理努力保护用户个人信息, 并对个人信息进行保护。为防止用户个人信息在意外的、未经授权的情况下泄漏。

压缩包内容校验基本方法同上,先解压缩,再逐文件处理。本文直接判断有敏感词,不让上传,也可以通过正则把信息替换成****后再转存,这里不再展开。

如有专门的更好用的插件请留言告知讨论,避免重复造轮子。

上传文件附件时判断word、excel、txt等是否含有敏感词如身份证号,手机号等的更多相关文章

  1. 关于confluence上传文件附件预览查看时出现乱码的问题解决办法

    在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候 ...

  2. confluence上传文件附件预览乱码问题(linux服务器安装字体操作)

    在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候 ...

  3. JAVAWeb SSH框架 上传文件,如2007的EXCEL

    下面的代码是上传EXCEL的代码,其实,就是在上传文件到服务器,代码都差不多,只是接收的文件的类型改一下即可. 1.jsp 用的是struts2 标签 代码: <s:file name=&quo ...

  4. hadoopmaster主机上传文件出错: put: File /a.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 3 datanode(s) running and 3 node(s) are excluded in this operation.

    刚开始装好hadoop的时候,namenode机上传文件没有错误,今天打开时突然不能上传文件,报错 put: File /a.txt._COPYING_ could only be replicate ...

  5. SpringMVC上传文件以流方式判断类型附常用类型

    // 此类中判断类型所截取的byte 长度暂不确定,请使用者测试过使用 package com.tg.common.other; import com.tg.common.tginterface.TG ...

  6. 后台使用Spring MVC 4.15 版本 通过 ajaxFileUpload plugin插件上传文件相应时引起的一个小问题,Chrome、Firefox中出现SyntaxError:unexpected token <

    html: 使用ajaxFileUpload插件做文件上传时,后台返回json格式的数据,js代码如下: 接下来,把结果错误信息打印出来: 先在网上找了下解决办法方案,stackoverflow上有说 ...

  7. zf-安徽桐城关于(资源中心-数据录入)上传文件后没有进行处理Excel文件的原因

    上传的文件 是会自动复制到另外一个路径的 如果没有进行处理 那么表示那个路径并没有那个文件 这样就会卡死 导致之后的文件都不会进行处理(后台有个变量是从数据库里获得文件路径的),所以需要去数据库 执行 ...

  8. 160414、java上传文件以流方式判断类型

    public enum FileType {       /**        * JEPG.        */       JPEG("FFD8FF"),          / ...

  9. Postman查看上传文件过程时出现400 - Required MultipartFile parameter 'files' is not present错误

    我在利用postman查看上传图片文件时,出现了如下图的错误,看到之后很懵逼. 图1 上网搜了一下,归结下来就是参数不一致导致的.不过还有一些是由于没加注解,如下图示: 图2 关于参数不一致问题,主要 ...

  10. input[type=file]上传文件(格式判断、文件大小、上传成功后操作)

    var isUploadImg = false; //在input file内容改变的时候触发事件******************上传图片 $('#filed').change(function( ...

随机推荐

  1. 【Java复健指南12】OOP高级03-抽象类与接口

    抽象类 引出 问题: ​ 父类方法有时候具有不确定性 小结: 当父类的某些方法,需要声明,但是又不确定如何实现 时,可以将其声明为抽象方法,那么这个类就是抽象类 例子: public class Ab ...

  2. Windows开发环境如何启用Directory.Build.props版本号集中管理

    每个产品一个根目录 Directory.Build.props的工作模式和NuGet.Config不同,Directory.Build.props不能继承.当dotnet restore工作的时候,会 ...

  3. 【Azure Logic App】消费型逻辑应用在消费Service Bus时遇见消息并发速度慢,消息积压

    问题描述 消费型逻辑应用(Consumption Logic App)使用触发器模式消费 Azure Service Bus的消息,当Service Bus中存在大量消息等待消费时,Logic App ...

  4. 固态硬盘使用f2fs作为根分区安装linux

    目录 前言 碰到的问题 对策 我的实际操作步骤 0.警告 1. 准备 2. 分区 3. 使用网络安装debian10 4. 备份根分区 5. 修改固态硬盘linux根分区为f2fs 6.恢复备份 7. ...

  5. java获取kafka consumer lag、endOffsets、beginningOffsets以及 KafkaConsumer总结

    一.java获取kafka consumer lag.endOffsets.beginningOffsets maven依赖: <dependency> <groupId>or ...

  6. dart特殊符号语法(一)

    许久没有写博客.浏览以往的博客,是那么稚嫩.就让它们当成成长的照片吧.重新开始操起这个记录的爱好,一方面把它当成可以查阅的资料,方便自己:另一方面希望有帮助于人.由于个人能力,认知有限,如读者发现有纰 ...

  7. .Java 关于继承小练习3

    1 package com.bytezero.inherit3; 2 3 public class CylinderTest 4 { 5 public static void main(String[ ...

  8. Jenkins Pipeline:根据参数设置环境变量

    pipeline { agent any environment { //以上自定义的参数 project = "$params.PROJECT" } stages { stage ...

  9. 闭关修炼180天----手写迷你版的tomcat-Minicat

    手写迷你版的tomcat-Minicat 小谈Tomcat Tomcat请求处理⼤致过程 Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器) 我们使 ...

  10. 本地锁 & 分布式锁

    引子: 解决缓存击穿问题 synchronized (this){代码块} public synchronized Map<String,List<Catelog2Vo>> g ...