.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
相关产品推荐
相关产品推荐

