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

如何将jsPDF生成的PDF文件正确发送至C#控制器?

如何将jsPDF生成的PDF文件正确发送至C#控制器?

我来帮你解决这个问题!你遇到的两个报错/数据为空的问题,本质都是前端数据格式和后端接收方式不匹配导致的,咱们一步步来修正:

先分析你之前的问题

  1. 第一个方案用datauristring时,出现"Illegal Invocation"错误:

    • 一方面datauristring自带data:application/pdf;base64,前缀,后端直接用Convert.FromBase64String会报错;另一方面你用JSON.stringify包裹后传参,jQuery的ajax在contentType: 'application/json'时,需要传纯JSON字符串,你的写法冗余且传输大文件效率不如Blob。
  2. 第二个方案用blob+FormData时,后端接收的data为null:

    • 因为你前端传的是文件对象,但后端参数定义的是string类型,两者不匹配,自然接收不到数据。

正确的解决方案

前端代码(Blob + FormData 方式,推荐)

这种方式是传输文件的标准做法,不会有格式问题:

function testPdfSend() {
    var doc = new jsPDF("l", "pt", "letter");
    
    // 完成PDF内容渲染(示例用document.body,可替换为你的目标元素)
    doc.html(document.body, {
        callback: function (pdf) {
            var pdfBlob = pdf.output('blob');
            var formData = new FormData();
            // 把Blob对象添加到FormData,键名要和后端参数名一致
            formData.append('pdfFile', pdfBlob, 'generated.pdf'); // 第三个参数是文件名,可选
            
            $.ajax({
                url: "/Jobs/SendEmailTest",
                type: 'POST',
                data: formData,
                // 这两个参数必须设为false,避免jQuery自动处理FormData导致解析失败
                processData: false,
                contentType: false,
                success: function(response) {
                    console.log("PDF发送成功!");
                },
                error: function(xhr, status, error) {
                    console.error("发送失败:", error);
                }
            });
        }
    });
}

后端代码(分两种框架情况)

根据你使用的ASP.NET版本,选择对应的接收方式:

如果是 ASP.NET MVC(旧版)

用HttpPostedFileBase来接收文件:

public ActionResult SendEmailTest(HttpPostedFileBase pdfFile)
{
    if (pdfFile != null && pdfFile.ContentLength > 0)
    {
        // 读取PDF的二进制内容
        byte[] pdfBinary;
        using (var memoryStream = new MemoryStream())
        {
            pdfFile.InputStream.CopyTo(memoryStream);
            pdfBinary = memoryStream.ToArray();
        }
        
        // 后续处理:比如保存文件、发送邮件等
        // ...
    }
    return null;
}
如果是 ASP.NET Core

用IFormFile来接收文件:

public IActionResult SendEmailTest(IFormFile pdfFile)
{
    if (pdfFile != null && pdfFile.Length > 0)
    {
        byte[] pdfBinary;
        using (var memoryStream = new MemoryStream())
        {
            pdfFile.CopyTo(memoryStream);
            pdfBinary = memoryStream.ToArray();
        }
        
        // 后续处理逻辑
        // ...
    }
    return Ok();
}

补充说明

  • 为什么processData和contentType要设为false?

    • processData: false:告诉jQuery不要把FormData转换成查询字符串,保持原有的文件格式;
    • contentType: false:让浏览器自动设置正确的Content-Type(会包含boundary分隔符),否则手动设置容易导致后端解析失败。
  • 如果一定要用Base64方式传输(不推荐大文件):
    你需要先把datauristring的前缀去掉,再传给后端:

    var pdfContent = pdf.output('datauristring').replace('data:application/pdf;base64,', '');
    $.ajax({
        url: "/Jobs/SendEmailTest",
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify({ data: pdfContent }),
        // ...
    });
    

    后端保持你原来的代码即可,但这种方式Base64会让文件体积增大30%左右,大文件不建议使用。

备注:内容来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:04:49