首页 > 其他分享 >前端上传文件的基本方法

前端上传文件的基本方法

时间:2023-09-20 22:03:09浏览次数:42  
标签:文件 const 对象 前端 xhr file fileInput 上传

前言

处理用户选择的文件并将之上传至服务器,这属于是前端开发的基本功。

虽然现在有各种框架和插件能够很简单地实现文件上传功能,但是作为一个有追求的前端,还是有必要了解以下前端文件上传的基本原理的。 ^ - ^

使用 FormData 对象上传文件

我们可以使用 FormData 对象来创建一个表单数据对象,以便在提交表单时发送数据。

FormData 对象是基于 XMLHttpRequest 对象实现的,它可以用于在客户端或服务器端发送和接收表单数据。

我们可以使用 FormData 对象将文件数据封装成表单数据,并设置上传目标为一个新的表单元素。然后,将表单数据发送到服务器。

const fileInput = document.getElementById('fileInput');
const fileToUpload = fileInput.files[0];

const formData = new FormData();
formData.append('file', fileToUpload);

const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.onload = function() {
  if (xhr.status === 200) {
    console.log('File uploaded successfully.');
  } else {
    console.log('Error uploading file.');
  }
};
xhr.send(formData);

注意事项:

  • FormData 对象主要用于在客户端上传文件和表单数据,它不适用于在服务器端接收数据。
  • 在使用 FormData 对象上传文件时,需要确保文件大小不超过服务器允许的最大文件大小。

使用 Blob 对象 上传文件

除了使用 FormData 对象外,我们还可以将 File 对象转化为 Blob 对象后再上传

实现原理:使用 HTML5 的 File API 获取用户选择的文件,并将文件数据封装成一个 Blob 对象,然后将 Blob 对象上传。

// 获取用户选择的文件
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(event) {
  const file = event.target.files[0];

  // 创建一个 Blob 对象
  const blob = new Blob([file], { type: file.type });

  // 创建一个 XMLHttpRequest 对象
  const xhr = new XMLHttpRequest();
  xhr.open('POST', '/upload');
  xhr.onload = function() {
    if (xhr.status === 200) {
      console.log('File uploaded successfully.');
    } else {
      console.log('Error uploading file.');
    }
  };
  xhr.send(blob);
});

扩展

通过上一篇文章对 File API 的学习,我们知道还有一个 FileReader 对象也可以读取本地文件,具体实现如下:

const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(event) {
  const file = event.target.files[0];
  // 创建一个 FileReader 对象
  const reader = new FileReader();
  reader.addEventListener('load', function(event) {
    const blob = new Blob([event.target.result], {type: file.type});
    // 创建一个 XMLHttpRequest 对象
    const xhr = new XMLHttpRequest();
    xhr.open('POST', '/upload');
    xhr.onload = function() {
      if (xhr.status === 200) {
        console.log('File uploaded successfully.');
      } else {
        console.log('Error uploading file.');
      }
    };
    xhr.send(blob);
  });
  reader.readAsArrayBuffer(file);
});

总结

以上就是前端常用的几种文件上传方案,我自己最常用的是使用 FormData 上传文件,你呢?

标签:文件,const,对象,前端,xhr,file,fileInput,上传
From: https://blog.51cto.com/bianchengsanmei/7543512

相关文章

  • 文件/目录的权限和归属 访问权限 读取:允许查看文件内容、显示目录列表 写入:允许修改
    文件/目录的权限和归属 访问权限读取:允许查看文件内容、显示目录列表写入:允许修改文件内容,允许在目录中新建、移动、删除文件或子目录可执行:允许运行程序、切换目录归属(所有权)属主:拥有改文件或目录的用户账号属组:拥有该文件或目录的组账号,组中用户查看文件/目录的权限和归属......
  • 我的 Windows 文件管理哲学
    前言  作为一个不合格的Geek,我经常面临把Windows弄崩溃的尴尬处境,我的系统因此重装了一遍又一遍……不过在一次次的重装中,我逐渐总结出了于我个人而言行之有效的文件管理哲学,在此略做总结。管理方法磁盘分区  我个人对磁盘分区没有什么特别的需求,现代的操作系统与电脑......
  • 【漏洞复现】亿赛通 电子文档安全管理系统 DecryptApplicationService2 任意文件上传
    1、简介亿赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业校心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能加密等多种加密方式,用户可......
  • Ansible专栏文章之六:组织多个文件以及Role
    回到:Ansible系列文章各位读者,请您:由于Ansible使用Jinja2模板,它的模板语法{%raw%}{{}}{%endraw%}和{%raw%}{%%}{%endraw%}和博客系统的模板使用的符号一样,在渲染时会产生冲突,尽管我尽我努力地花了大量时间做了调整,但无法保证已经全部都调整。因此,如果各位阅读时发......
  • 自定义读取指定目录下下文件
    publicclassPropertiesUtil{privatestaticfinalStringPath="config/param.properties";/***读取配置文件中key的对应值*/publicstaticStringqueryValue(Stringkey){if(StringUtils.isBlank(key))return"";......
  • 使用js开发一个快速打开前端项目的alfred插件
    使用js开发一个快速打开前端项目的插件目录前言使用的技术栈步骤问题发现待优化前言一直以来开发都是先打开vscode,然后选择项目,在项目多的情况下会觉得挺繁琐;如果同时打开了许多vscode窗口,寻找目标窗口也比较麻烦,于是萌生了开发一个alfred的工作流插件的想法,目标是在alf......
  • 响应头:关于文件下载的Content-Disposition和Content-Type(转载)
    Content-Type实体头部用于指示资源的MIME类型,在响应中,Content-Type标头告诉客户端实际返回的内容的类型,指示客户端如何显示附加的文件。  Content-Disposition是MIME协议的扩展,指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分,这种方式就与Content-Type......
  • php实现大文件断点续传下载实例
    php实现大文件断点续传下载实例,看完你就知道超过100M以上的大文件如何断点传输了,这个功能还是比较经典实用的,毕竟大文件上传功能经常用得到。1require_once('download.class.php');2date_default_timezone_set('Asia/Shanghai');3error_reporting(E_STRICT);4......
  • javaweb运行tomcat时Jsp文件显示源码
    今天在写javaweb项目的时候出现了运行一直不打开浏览器,如果手动打开浏览器的话,就会出现自己写的jsp文件中的所有源码,具体如图所示我的问题在Servlet中因为要告诉jsp文件servlet在哪里所以要在类名的上一行写上@WebServlet("/Servlet"),但是由于我的粗心写成了@WebServlet("Servl......
  • main 与 test 资源文件冲突
    一个文件同时存在于xxx-war下,main的在classes下test的在classess-test下1)打包时不包括test目录下https://zhuanlan.zhihu.com/p/6306427842)打包时忽略test的编译-DskipTests与-Dmaven.test.skip ......