基于Angular+Web API的上传文件元数据清除方案咨询
服务端清除上传文件元数据的解决方案
针对你使用Angular+Web API搭建的系统,要在服务端上传阶段清除docx、xlsx、jpg、png、pdf文件的元数据,可按以下步骤实现:
1. 安装依赖NuGet包
根据不同文件类型,安装对应的处理库:
Install-Package SixLabors.ImageSharp # 处理jpg/png图片 Install-Package DocX # 处理docx文档 Install-Package EPPlus # 处理xlsx表格 Install-Package iTextSharp # 处理PDF文件
2. 编写元数据清除工具类
创建静态工具类,封装不同文件类型的元数据清除逻辑:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Processing; using Novacode; using iTextSharp.text.pdf; using OfficeOpenXml; using System.IO; using System.Collections.Generic; public static class FileMetadataCleaner { // 清除图片(jpg/png)元数据 public static Stream CleanImageMetadata(Stream inputStream) { var outputStream = new MemoryStream(); using (var image = Image.Load(inputStream)) { // 移除所有Exif、Icc、Xmp元数据 image.Metadata.ExifProfile = null; image.Metadata.IccProfile = null; image.Metadata.XmpProfile = null; image.Save(outputStream, image.DetectFormat(inputStream)); outputStream.Position = 0; return outputStream; } } // 清除Docx文档元数据 public static Stream CleanDocxMetadata(Stream inputStream) { var outputStream = new MemoryStream(); using (var doc = DocX.Load(inputStream)) { // 清除内置属性、页眉页脚、自定义属性 doc.Properties.Clear(); doc.RemoveHeaders(); doc.RemoveFooters(); foreach (var prop in doc.CustomProperties) { doc.RemoveCustomProperty(prop.Key); } doc.SaveAs(outputStream); outputStream.Position = 0; return outputStream; } } // 清除Xlsx表格元数据 public static Stream CleanXlsxMetadata(Stream inputStream) { var outputStream = new MemoryStream(); // 非商用场景设置授权上下文,商用需购买EPPlus授权 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage(inputStream)) { // 清除文档内置属性和自定义属性 package.Workbook.Properties.Clear(); package.Workbook.CustomProperties.Clear(); package.SaveAs(outputStream); outputStream.Position = 0; return outputStream; } } // 清除PDF文件元数据 public static Stream CleanPdfMetadata(Stream inputStream) { var outputStream = new MemoryStream(); using (var reader = new PdfReader(inputStream)) using (var stamper = new PdfStamper(reader, outputStream)) { // 清除文档信息字典和XMP元数据 reader.Info.Clear(); stamper.MoreInfo = new Dictionary<string, string>(); stamper.XmpMetadata = null; } outputStream.Position = 0; return outputStream; } // 根据文件扩展名自动匹配清除方法 public static Stream CleanMetadataByExtension(Stream inputStream, string fileExtension) { return fileExtension.ToLower() switch { ".jpg" or ".jpeg" or ".png" => CleanImageMetadata(inputStream), ".docx" => CleanDocxMetadata(inputStream), ".xlsx" => CleanXlsxMetadata(inputStream), ".pdf" => CleanPdfMetadata(inputStream), _ => inputStream // 不支持的类型直接返回原流 }; } }
3. 修改文件保存逻辑
在Web API的SaveQueryDocuments方法中,先清除元数据再保存文件:
private bool SaveQueryDocuments(int queryHeaderId, List<DTOQueryDocumentFileFormat> documents) { try { foreach (var doc in documents) { // 获取文件扩展名 var fileExtension = Path.GetExtension(doc.FileName); // 调用工具类清除元数据 using var cleanedStream = FileMetadataCleaner.CleanMetadataByExtension(doc.FileStream, fileExtension); // 定义文件保存路径(替换为你的实际存储路径) var saveFileName = $"{queryHeaderId}_{Guid.NewGuid()}{fileExtension}"; var savePath = Path.Combine("Your/Storage/Directory", saveFileName); // 将处理后的文件写入存储 using var fileStream = new FileStream(savePath, FileMode.Create); cleanedStream.CopyTo(fileStream); // 此处可添加数据库记录逻辑,保存文件路径、文件名等信息 } return true; } catch (Exception ex) { // 记录异常日志,根据实际情况处理错误 return false; } }
注意事项
- 处理大文件时,全程使用流操作避免内存溢出
- EPPlus商用场景需购买官方授权,非商用可使用
LicenseContext.NonCommercial - 确保处理后的流
Position重置为0,否则会写入空内容 - 可添加日志记录,跟踪元数据清除过程中的异常情况
内容的提问来源于stack exchange,提问作者Abhijith Nayak
相关产品推荐
相关产品推荐

