欢迎关注得胜的git仓库

js在当前页面预览PDF或图片

核心思路:在iframe标签中显示预览的内容。

思路:iframe相当于一个浏览器的一个新的页签,大家都知道PDF可以在浏览器中打开查看,也就是可以预览,所以当前页面中加入一个iframe就可以实现预览了。

新页签是用location.href指定文件地址,iframe是改src来指定文件地址或者通过location.href指定,具体如下。

此时有个问题,如果是二进制文件流,该如何预览呢?使用URL.createObjectURL(blob);就可以生成一个url,然后再赋值给iframe的src就可以了。

// 通过location.href指定地址
window.preview.location.href = url; // preview是iframe的name属性值
// 通过src指定地址, 建议使用这种方式
oIframe.src = url; // oIframe是iframe的Dom对象
// 如果是文件流,或者文件,用window.URL.createObjectURL生成一个url
const url = window.URL.createObjectURL(fileBlob);
// url使用完成(关闭预览)时,尽量使用window.URL.revokeObjectURL(url)销毁前面生成的url,防止内存泄漏

完整例子如下:

复制代码
<div class="wrap">
  <p>
    <button onclick="show()">预览</button>
    <button onclick="closeIframe()">关闭</button>
    <button onclick="download()">下载</button>
  </p>
  <p>
    <input id="previewFileInput" type="file" accept=".png,.jpeg,.jpg,.pdf" />
    <button onclick="showFile()">预览文件</button>
  </p>
  <iframe src="" id="jj" name="jj" frameborder="0" style="width: 100%; height: 80vh;"></iframe>
</div>
复制代码
复制代码
const url = "https://img2022.cnblogs.com/blog/35695/202202/35695-20220218195518714-1211340510.jpg";
const oIframe = document.getElementById("jj");

function closeIframe() {
  // window.jj.location.href = ''; // jj是iframe的name属性值
  // window.jj.close(); // jj是iframe的name属性值
  oIframe.style.display = 'none';
}

function downLoad(url) {
  var oA = document.createElement("a");
  oA.download = ""; // 设置下载的文件名,默认是'下载'
  oA.href = url;
  document.body.appendChild(oA);
  oA.click();
  oA.remove(); // 下载之后把创建的元素删除
}

function download() {
  downLoad(url);
}

function show() {
  // window.jj.location.href = url; // jj是iframe的name属性值
  oIframe.src = url; // jj是iframe的name属性值
  oIframe.style.display = 'block';
}

function showFile() {
  // 如果元素有id,可以直接用id的值访问元素哦~ 例如: previewFileInput
  if (!previewFileInput.files) {
    alert('请选择预览文件撒');
    return;
  }
  const url = window.URL.createObjectURL(previewFileInput.files[0]);
  oIframe.src = url;
  oIframe.style.display = 'block';
}
复制代码

 

posted on   web得胜  阅读(2813)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

感谢观看web得胜的博客,如果您觉得对你有帮助,请点赞支持一下哦~。发现问题请留言指正,谢谢!
点击右上角即可分享
微信分享提示