You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:17:09