如何将jsPDF生成的PDF文件正确发送至C#控制器?
如何将jsPDF生成的PDF文件正确发送至C#控制器?
我来帮你解决这个问题!你遇到的两个报错/数据为空的问题,本质都是前端数据格式和后端接收方式不匹配导致的,咱们一步步来修正:
先分析你之前的问题
第一个方案用
datauristring时,出现"Illegal Invocation"错误:- 一方面
datauristring自带data:application/pdf;base64,前缀,后端直接用Convert.FromBase64String会报错;另一方面你用JSON.stringify包裹后传参,jQuery的ajax在contentType: 'application/json'时,需要传纯JSON字符串,你的写法冗余且传输大文件效率不如Blob。
- 一方面
第二个方案用
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
相关产品推荐
相关产品推荐

