首页 > 其他分享 >基础知识之上传与下载

基础知识之上传与下载

时间:2023-12-15 20:00:26浏览次数:30  
标签:files const 之上 基础知识 fileSize file return 上传 下载

缘起

上传和下载是两个经典场景,做项目的时候遇到了这两种情况。

上传

设置上传按钮

const upoadImgCom = () => {
  return (
    <>
      <label className={styles["upload-button"]} htmlFor="fileInputCompanyLogo">
        +
      </label>
      <input
        id="fileInputCompanyLogo"
        accept={acceptFileTypeList}
        onChange={uploadFileAction}
        type="file"
        multiple
      />
    </>
  );
};

相应样式文件

.upload-button {
  color: #c3c3c3;
  background: #f2f2f2;
  width: 100px;
  display: flex;
  height: 40px;
  justify-content: center;
  align-items: center;
  cursor: pointer;
  &:hover {
    color: #008cff;
    border: 1px solid #008cff;
  }
}
input {
  display: none;
}

获取上传文件

注意这里获取到的uploadFile.files是文件流类型,不能用数组方法。[...uploadFileEle.files]转化为数组类型后,判断是否通过上传校验(大小、文件类型等)

const uploadFileAction = (e) => {
  const uploadFileEle = document.querySelector("#fileInputCompanyLogo");
  if (!uploadFileEle.files.length) return;
  // 校验上传文件是否符合准入条件
  const files = [...uploadFileEle.files];
  const isValid = beforeUpload(files, fileSizeLimit, legTypeList);
  if (!isValid) return;

  const file = uploadFileEle.files[0];
  dispatch({ type: "uploadImg", payload: file });
  // onchange监听的为input的value值,只有再内容发生改变的时候去触发
  // 成功后将value值置空,使得能够检测到下一次上传内容
  e.target.value = "";
  // }
};

关于beforeUpload方法

以上传 20MB,类型为图片文件为例

// 文件大小限制
const fileSizeLimit = 20 * 1024 * 1024;
// 文件类型限制
const legTypeList = ["png", "jpg", "jpeg"];

// 1 KB = 1024 B
// 转换文件大小为可读单位
export const getFileSize = (fileSize) => {
  let result = "";

  if (fileSize >= 1073741824) {
    // B => GB
    result =
      fileSize % 1073741824 === 0
        ? `${fileSize / 1073741824}G`
        : `${Math.trunc(fileSize / 1073741824)}G`;
  } else if (fileSize >= 1048576) {
    // B => MB
    result =
      fileSize % 1048576 === 0
        ? `${fileSize / 1048576}MB`
        : `${Math.trunc(fileSize / 1048576)}MB`;
  } else if (fileSize >= 1024) {
    // B => KB
    result =
      fileSize % 1024 === 0
        ? `${fileSize / 1024}KB`
        : `${Math.trunc(fileSize / 1024)}KB`;
  } else if (fileSize !== undefined) {
    result = `${fileSize}B`;
  }
  return result;
};

// 根据文件名后缀获取当前文件类型
export const getLastFileTypeByName = (value) => {
  const dotArray = value.split(".");
  const lastDotArray = dotArray[dotArray.length - 1];
  return lastDotArray;
};

export const getFileTypeBySource = (file, legitTypeList) => {
  // 注意这里的类型判断一定要从文件名读取! ios 无 file.type!!!
  const exactFileValue = file.name;
  const lastFileTypeByName = getLastFileTypeByName(exactFileValue);

  // 实测移动端 不走相册 直接选图片文件 尾缀为大写PNG 这里多加一层逻辑
  // ↑ 从H5抄过来的 问题不大
  // 这里全部转换成小写 进入匹配
  let isLegitType = false;
  isLegitType = legitTypeList.some((key) =>
    lastFileTypeByName.toLowerCase().includes(key)
  );
  return isLegitType;
};

// 上传文件前置校验 文件类型 文件大小
export const beforeUpload = (files, fileSizeLimit, legTypeList) => {
  const readableMaxFileSize = getFileSize(fileSizeLimit);
  const fileSupportTypeText = legTypeList.join("、");

  // if (!(files && files.length)) {
  //   message.error(`请添加${kind}`);
  //   return false;
  // }

  let flag = true;

  // eslint-disable-next-line consistent-return
  files.forEach((file) => {
    const isLegFileType = getFileTypeBySource(file, legTypeList);

    if (!isLegFileType) {
      message.error(`文件支持格式: ${fileSupportTypeText}`);
      flag = false;
    }
    if (file.size > fileSizeLimit) {
      message.error(`文件最大支持${readableMaxFileSize}`);
      flag = false;
    }
  });
  return flag;
};

上传图片后可临时预览

https://juejin.cn/post/7240486780578480189

FileReader 转换为 base64 格式

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>图片本地预览示例</title>
  </head>
  <body>
    <h3>阿宝哥:图片本地预览示例</h3>
    <input type="file" accept="image/*" onchange="loadFile(event)" />
    <img id="previewContainer" />

    <script>
      const loadFile = function (event) {
        const reader = new FileReader();
        reader.onload = function () {
          const output = document.querySelector("#previewContainer");
          output.src = reader.result;
        };
        reader.readAsDataURL(event.target.files[0]);
      };
    </script>
  </body>
</html>


下载

图片、pdf、xml 的链接点击是预览
需要转换成 blob 文件流

五种方法 以及 对比
https://juejin.cn/post/6844904069958467592?searchId=20231215174642867C7A34315E52A747FB#heading-20

浏览器打开图片链接是直接预览还是下载

取决于图片链接的响应头 Content-Disposition 的属性
Content-Disposition 为 inline 在浏览器打开直接预览
Content-Disposition 为 attachment 在浏览器打开直接下载

链接:https://juejin.cn/post/7177346491059535932

值得一看的参考文章

前端二进制相关知识
https://juejin.cn/post/7262754051271032891?searchId=2023121416035302BFFAA3DF21DC00CAF9

标签:files,const,之上,基础知识,fileSize,file,return,上传,下载
From: https://www.cnblogs.com/lepanyou/p/17904106.html

相关文章

  • macOS Monterey 12.7.2 (21G1974) Boot ISO 原版可引导镜像下载
    macOSMonterey12.7.2(21G1974)BootISO原版可引导镜像本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。macOSMonterey12.7.x如无特殊说明,皆为安......
  • macOS Sonoma 14.2 (23C64) 正式版 Boot ISO 原版可引导镜像下载
    macOSSonoma14.2(23C64)正式版BootISO原版可引导镜像下载本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。请访问原文链接:https://sysin.org/blog......
  • macOS Ventura 13.6.3 (22G436) Boot ISO 原版可引导镜像下载
    macOSVentura13.6.3(22G436)BootISO原版可引导镜像macOSVentura13.6及更新版本,如无特殊说明皆为安全更新,不再赘述。本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linu......
  • 一、MySQL概述及下载安装
    一、数据库概述二、什么是SQL三、安装MySQL四、卸载MySQL五、查看MySQL服务六、MySQL服务启停七、登录MySQL......
  • javaweb实现文件上传与下载功能
    本文实例为大家分享了javaweb文件的上传与下载,供大家参考,具体内容如下一、文件上传要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。上传大多数情况是通过表单的形式提交给服务器,使用<inputt......
  • vue 前端自动打开文件地址进行下载
    最近在做异步导出的功能,导出的过程中前端另外启动一个查询导出进度的线程接口。如果导出完成后,把生成的文件上传到服务器,返回给前端一个文件的下载地址;前端自动打开这个地址进行跳转下载。有两种方式1.直接使用js自带的方式打开链接这种方式有一个问题,会被浏览器自动拦......
  • javascript怎么实现文件上传和下载功能
    在现代Web开发中,文件上传和下载是经常遇到的需求。JavaScript作为前端开发的语言之一,提供了许多强大的工具库和API来管理文件上传和下载的过程。本文将探讨如何使用JavaScript实现文件上传和下载的功能,首先介绍基于HTML5的FileAPI,然后使用jQuery和XMLHttpRequest......
  • HTML5 文件上传下载的实例代码
    前言HTML5中提供的文件API在前端中有着丰富的应用,上传、下载、读取内容等在日常的交互中很常见。而且在各个浏览器的兼容也比较好,包括移动端,除了IE只支持IE10以上的版本。想要更好地掌握好操作文件的功能,先要熟悉每个API。FileList对象和file对象HTML中的input[type=......
  • backblaze b2通过cli下载大文件快照snapshots
    按照官方的常规方式,是先在cli下查看buckets  list-buckets找到b2snapshots的名称,然后通过download-file下载b2download-file--thread1b2://snapshots目录/备份文件名.注意下载大文件,最好是把现成设置成1-----------------------以上是常规方法,但是我下载了几......
  • docker安装aira2 pro与ariang以及alist推送下载的配置
    Docker一键安装aira2-pro:dockerrun-d--namearia2--restartunless-stopped--log-optmax-size=1m-ePUID=$UID-ePGID=$GID-eUMASK_SET=022-eRPC_SECRET=12345678-eRPC_PORT=6800-eLISTEN_PORT=6888-p16800:6800-p16888:6888-p16888:6888/udp-v/mnt/c/......