读取已存在的PDF文件,path为绝对路径
string base64String = "";
byte[] buffer=null; using (FileStream fs = new FileStream(path, FileMode.Open)) { long fileSize = fs.Length; buffer = new byte[(int)fileSize]; fs.Read(buffer, 0, (int)fs.Length); base64String = Convert.ToBase64String(buffer); } //生成base64后删除原文件 if (System.IO.File.Exists(newPdf)) { System.IO.File.Delete(newPdf); }
//return File(buffer, "application/ms-pdf", fileName);//返回文件流,前台接收可以直接下载 return Json(new { success = true, pdfBase64String = "data:application/pdf;base64," + base64String });
前台接收处理,接收到的字符串赋值到iframe的src上,由于我用的layui,弹出层可以根据type决定类型,type值为2就是iframe弹出层,所以直接就赋值给弹出层了
function lookInfo(id) { layer.load(1); $.ajax({ url: '/Login/DownLoad', type: 'post', data: {id : id}, success: function (data) { layer.closeAll('loading'); if (data.success) { layer.open({ title: "信息", type: 2, area: ['100%', '100%'], content: data.pdfBase64String }); } else { layer.msg(data.msg, { icon: 5, time: 2000 }); } }, error: function () { layer.closeAll('loading'); layer.msg('网络错误,请稍后重试', { icon: 5, time: 2000 }); } }) }
上面后台还注释(橙色字体)了一个返回文件流的方式,这种情况前台直接调用后台路径,就可以下载了。如:
window.open("/Login/DownLoad?id=" + id;