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

.NET中将表单上传的PDF转Base64字符串报类型转换错误如何解决

问题说明

PDF文件完全可以正常转换为Base64字符串,你遇到的报错和文件格式无关,是代码实现逻辑错误导致的。

错误原因

  • 接收表单上传文件的参数类型写错了:ASP.NET Core 中接收HTTP请求上传的文件,必须使用IFormFile类型,你使用的File/FileInfo是用来处理服务器本地磁盘文件的类型,和上传场景不匹配。
  • System.IO.File.ReadAllBytes()方法要求传入的参数是服务器本地文件的路径字符串,你直接传入文件对象本身,自然会抛出类型不匹配的错误。

正确实现方案

1. 后端代码修正

首先确保引入IFormFile所在的命名空间,然后通过流读取上传文件内容再转Base64:

using Microsoft.AspNetCore.Http;
using System.IO;

[HttpPost]
public async Task<IActionResult> AddDocument(IFormFile formFile)
{
    // 基础校验
    if (formFile == null || formFile.Length == 0)
    {
        return BadRequest("请上传有效的PDF文件");
    }
    string fileExt = Path.GetExtension(formFile.FileName).ToLower();
    if (fileExt != ".pdf" || formFile.ContentType != "application/pdf")
    {
        return BadRequest("仅支持PDF格式文件");
    }

    // 读取上传文件二进制内容
    using var ms = new MemoryStream();
    await formFile.CopyToAsync(ms);
    byte[] fileBytes = ms.ToArray();

    // 转Base64字符串
    string pdfBase64 = Convert.ToBase64String(fileBytes);
    // 如果需要前端直接识别的DataURL格式,可以加前缀:
    // string pdfDataUrl = $"data:application/pdf;base64,{pdfBase64}";

    // 后续业务逻辑
    // ...
    return Ok();
}

2. 前端注意事项

包裹文件上传控件的表单必须添加enctype="multipart/form-data"属性,否则浏览器不会把文件内容提交到后端,参考代码:

<form method="post" action="/你的接口地址/AddDocument" enctype="multipart/form-data">
    <input class="form-control" type="file" id="formFile" style="display:block" name="formFile" accept=".pdf">
    <button type="submit">上传文件</button>
</form>

注意事项

  • 不要用System.IO.File下的静态方法处理HTTP上传的文件,这类方法仅用于操作服务器本地磁盘的文件,上传文件存在于请求流中,必须通过IFormFile提供的流方法读取。
  • Base64编码后的内容会比原文件体积大1/3左右,如果是超过100MB的大PDF,不建议直接全量加载到内存转Base64,容易触发服务器内存溢出问题,小体积PDF场景上述写法完全可用。

内容的提问来源于stack exchange,提问作者dros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:12:42