文件预览

564 阅读1分钟

在本地文件上传前或者对网络资源有些需要预览的场景,浏览器有自己对于文件的默认行为。对于图片、音频、视频或者pdf等资源,浏览器直接用自己默认的方式进行展示,对于浏览器不能使用默认的方式打开的,自动下载到本地进行预览。

  • 极简预览
const fileUrl = typeof url === "string" ? url : URL.createObjectURL(url);
window.open(fileUrl, "_blank")
  • 自定义预览
import { isImg, isVideo, isPdf } from "./files";
export function filePreview(url, name) {
  // 支持原生文件或者url文件的预览
  const fileUrl = typeof url === "string" ? url : URL.createObjectURL(url);
  const fileName = name;
  const cacheWrap = document.querySelector(".qb-preview-wrap");
  if (cacheWrap) {
    return;
  }
  // 文件容器
  const wrap = document.createElement("div");
  wrap.className = "qb-preview-wrap";
  // 插入关闭按钮
  const closeBtn = document.createElement("span");
  closeBtn.className = "el-previe-img-btn";
  const closeIcon = document.createElement("i");
  closeIcon.className = "el-icon-close";
  closeBtn.appendChild(closeIcon);
  closeBtn.addEventListener("click", function () {
    document.body.removeChild(wrap);
  });
  wrap.appendChild(closeBtn);
  // 图片
  const isImgFlag = isImg(fileName);
  if (isImgFlag) {
    const imgWrap = document.createElement("img");
    imgWrap.src = fileUrl;
    imgWrap.className = "qb-preview-img-wrap";
    wrap.appendChild(imgWrap);
    document.body.appendChild(wrap);
    return;
  }
  // 视频
  const isVideoFlag = isVideo(fileName);
  if (isVideoFlag) {
    const videoWrap = document.createElement("video");
    videoWrap.src = fileUrl;
    videoWrap.className = "qb-preview-video-wrap";
    videoWrap.controls = "controls";
    videoWrap.autoplay = true;
    wrap.appendChild(videoWrap);
    document.body.appendChild(wrap);
    return;
  }
  // pdf
  const isPdfFlag = isPdf(fileName);
  if (isPdfFlag) {
    const pdfWrap = document.createElement("iframe");
    pdfWrap.src = fileUrl;
    pdfWrap.className = "qb-preview-iframe-wrap";
    wrap.appendChild(pdfWrap);
    document.body.appendChild(wrap);
    return;
  }
  // 如果都不支持,直接下载
  window.open(fileUrl, "_blank");
}

附件:files文件

// getFileType获取文件类型
export function getFileType(fileName) {
  // 建立文件正则验证
  let reg =
    /(.doc)$|(.docx)$|(.pdf)$|(.ppt)$|(.pptx)$|(.xlsx)$|(.xls)$|(.zip)$|(.rar)$|(.txt)$|(.mp3)|(.mp4)$|(.jpg)$|(.png)$|(.jpeg)$/;
  return fileName.match(reg) ? fileName.match(reg)[0].slice(1) : null;
}
// 是否是文件
export function isImg(fileName) {
  const fileSuffix = getFileType(fileName);
  return (fileSuffix &&    (fileSuffix === "png" || fileSuffix === "jpg" || fileSuffix === "jpeg"));
}
// 是否是视频
export function isVideo(fileName) {
  const fileSuffix = getFileType(fileName);
  return fileSuffix && fileSuffix === "mp4";
}

// 是否是pdf
export function isPdf(fileName) {
  const fileSuffix = getFileType(fileName);
  return fileSuffix && fileSuffix === "pdf";
}

以上是极简的文件预览,也可以在其中进行更多功能的扩展。