首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

原生js 上传文件

在使用原生 JavaScript 实现文件上传时,主要涉及到 HTML 的 <input type="file"> 元素与 JavaScript 的 FormData 对象结合使用。以下是关于原生 JS 文件上传的基础概念、优势、类型、应用场景以及常见问题及其解决方案的详细说明:

基础概念

1. 文件输入元素 (<input type="file">)

  • 用于让用户选择本地文件。
  • 可以通过设置 multiple 属性允许选择多个文件。

2. FormData 对象

  • 一种用于构造表单数据的接口,方便将文件和其他数据一起发送到服务器。
  • 支持异步上传,通常与 XMLHttpRequestfetch API 结合使用。

3. 异步上传

  • 使用 AJAX(Asynchronous JavaScript and XML)技术实现无需刷新页面即可上传文件。

优势

  • 用户体验好:无需刷新页面,实时反馈上传进度。
  • 灵活性高:可以在上传前对文件进行验证和处理。
  • 兼容性强:现代浏览器普遍支持相关技术。

类型

  • 简单文件上传:上传单个文件。
  • 多文件上传:同时上传多个文件。
  • 拖拽上传:用户可以通过拖拽方式选择文件上传。

应用场景

  • 用户头像上传
  • 文档资料的提交
  • 图片库的图片上传
  • 视频内容的上传

示例代码

以下是一个使用原生 JavaScript 实现文件上传的示例:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>文件上传示例</title>
</head>
<body>
    <form id="uploadForm">
        <input type="file" id="fileInput" name="file" />
        <button type="submit">上传</button>
    </form>
    <div id="progress"></div>

    <script>
        document.getElementById('uploadForm').addEventListener('submit', function(e) {
            e.preventDefault();
            const fileInput = document.getElementById('fileInput');
            const file = fileInput.files[0];
            if (!file) {
                alert('请选择一个文件');
                return;
            }

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

            fetch('/upload', { // 替换为实际的上传接口
                method: 'POST',
                body: formData
            })
            .then(response => response.json())
            .then(data => {
                console.log('上传成功:', data);
                document.getElementById('progress').innerText = '上传成功';
            })
            .catch(error => {
                console.error('上传失败:', error);
                document.getElementById('progress').innerText = '上传失败';
            });
        });
    </script>
</body>
</html>

常见问题及解决方案

1. 上传进度无法显示

  • 原因fetch API 默认不支持上传进度事件。
  • 解决方案:使用 XMLHttpRequest 来监听上传进度,或者使用第三方库如 Axios

示例使用 XMLHttpRequest 显示进度:

代码语言:txt
复制
const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');

xhr.upload.onprogress = function(event) {
    if (event.lengthComputable) {
        const percentComplete = (event.loaded / event.total) * 100;
        document.getElementById('progress').innerText = `上传进度: ${percentComplete.toFixed(2)}%`;
    }
};

xhr.onload = function() {
    if (xhr.status === 200) {
        document.getElementById('progress').innerText = '上传成功';
    } else {
        document.getElementById('progress').innerText = '上传失败';
    }
};

xhr.send(formData);

2. 文件大小限制

  • 原因:服务器或客户端设置了文件大小限制。
  • 解决方案
    • 检查服务器配置(如 Nginx 的 client_max_body_size)。
    • 在前端进行文件大小验证,防止过大文件上传。

示例前端验证文件大小:

代码语言:txt
复制
const maxSize = 5 * 1024 * 1024; // 5MB
if (file.size > maxSize) {
    alert('文件大小不能超过5MB');
    return;
}

3. 跨域问题

  • 原因:前端和后端不在同一个域,导致浏览器阻止请求。
  • 解决方案
    • 后端设置正确的 CORS(跨源资源共享)头,允许特定域的请求。
    • 使用代理服务器转发请求。

总结

使用原生 JavaScript 实现文件上传主要依赖于 <input type="file"> 元素和 FormData 对象,结合 fetchXMLHttpRequest 进行异步上传。通过合理处理上传进度、文件验证和跨域等问题,可以实现稳定且用户体验良好的文件上传功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

原生JS处理多文件上传到腾讯云(对象存储)

写在前面 其实在这篇文章之前呢已经写过一篇关于文件上传的文章了,名字是文件上传腾讯云,如果看这篇文章的话,希望还是先看看我之气那写的那篇文章,不然下面的可能直接看的话会有一些迷惑。...废话不说,既然是上传,就免不了单文件或者多文件上传的问题,那么其实目前很多的框架都是有上传功能的,只要是将接口写好,直接用就行了,就是包括腾讯云也是提供一个接口我们直接使用就可以的,下面我们就使用腾讯的接口完成多文件上传的处理...文件上传有几个问题需要处理: 第一:拿到文件的名字 第二:拿到文件本身 第三:多文件的时候,需要将文件存储到数组里面,上传的时候遍历出来 这三个问题我们一个一个解决 拿到文件名字其实很简单: selectedFile...DOCTYPE html> js/cos-js-sdk-v5....js" type="text/javascript" charset="utf-8"> js/jquery-1.11.2.min.js" type="text

11.1K10

原生的文件拖拽上传

老规矩先说需求:上传文件需要拖拽上传 正常来讲一个UI库就支持了 比如antd的uploads组件 但是考虑到设计图的差异太大了,所以需要自己来实现 也是很简单的: 直接上代码吧 这个代码中包括了上传s3...DOCTYPE html>             原生拖拽上传     <style...;         width: 1050px;         min-height: 300px;       }                原生拖拽上传... 作为“数据URL”           //            reader.readAsDataURL(f);           //            当客户端文件读取完成 触发onload...事件         }       };       async function reader(file) {         // 这里能获取到拖拽过来的文件了         // 我这边是经过了一层

94320
  • js文件分片上传

    写在前面 今天我们写一下关于js的分片上传,因为工作中很多时候上传文件是比较大的,为了不让卡死,我们可以使用分片上传的方式进行文件的传输,下面就简单的将思路梳理一下,然后贴上代码 思路分析 既然是分片上传...,也就是说,假设一个文件的大小是10Mb,我们将其分为十份,每一份都按照前面所的完整的上传过程进行上传,然后循环十次即可将全部的都上传结束,这是我们的基本思路,下面我们贴上代码分析一下 源代码实现...fragmentAtionUpload 分片上传 * @params file 上传的文件 * @params cbUrl 上传的回调函数 * @params size 分片的大小...,url和分片的大小,回调函数就做一件事,就是上传,他不管上传的大小,所以我们在循环的时候反复调用这个函数即可,最后是文件操作的函数就不多说了,总体来说最基本的分片上传还是比较简单的。...问题分析 这里有一个比较致命的问题,就是因为是分片上传,所以文件是被切成了一段一段的,那么就意味着如果上传的过程中因为网络或者别的原因中断了,那么问题就比较严重了,你可以选择重新上传,但是因为前面的一些片段已经上传上去了

    7.6K20

    js 大文件上传的思路

    bug收集:专门解决与收集bug的网站 网址:www.bugshouji.com 今日分享:JS 上传大文件的解决思路 1....文件切片 把一个大文件转换成二进制内容,然后按照一个固定的大小对二进制内容进行切割,得到多个小文件,然后循环上传所有的小文件。...在js中,文件File对象是Blob对象的子类,可以使用 slice() 方法完成对文件的切割; 获取文件对象( e.target.files[0]) // 选中的文件 var file = null...文件合并 当所有小文件上传完成,调用接口通知后端把所有的文件按编号进行合并,组成大文件; if (list.length === 0) { //所有任务完成,合并切片 await...断点续传 把所有上传失败的小文件加入一个数组里面,在所有小文件都上传结束(成功和失败都算结束)之后再上传一次上传失败了的小文件,反复执行这一步,直到所有小文件都上传成功,可以通过递归实现。

    7K30

    js文件异步上传进度条

    进度条的应用是为了显示的告诉用户文件上传了多少,对于小文件的上传基本上应用不到进度条。...进度条主要应用于大文件的上传,在于告诉用户上传情况,不至于让用户无状态等待,增加了用户的体验,如果没有进度条,在上传过程中,用户不知道是不是卡死了,这种体验就很差了,下面我们来说一下如何在异步上传时显示进度条...其实无论是原生js写xhr,还是jq的ajax,还是axios的异步都提供了一个获取上传进度的API,首先我们来看一下原生js如何获取上传进度。...原生js获取上传进度 var fd = new FormData(); fd.append("file", document.getElementById('testFile').files[0]);...; } }); axios获取上传进度 在axios中提供了一个参数onUploadProgress,有了这个参数就可以很方便的获取上传进度了,其方法实现还是和原生js的一样,这个参数其实就是注册一个监听事件

    10K20

    3分钟教你用原生js实现具有进度监听的文件上传预览组件

    本文主要介绍如何使用原生js,通过面向对象的方式实现一个文件上传预览的组件,该组件利用FileReader来实现文件在前端的解析,预览,读取进度等功能,并对外暴露相应api来实现用户自定义的需求...,比如文件上传,进度监听,自定义样式,读取成功回调等。...涉及的核心知识点如下: 闭包:减少变量污染,缩短变量查找范围 自执行函数 file API:对文件进行读取,解析,监控文件事件 DocumentFragment API:主要用来优化dom操作 minix...:用来实现对象混合 正则表达式:匹配文件类型 class :类组件 github地址 用原生js实现具有进度监听的文件上传预览组件 Demo演示 ?.../js/xjFile.js"> new xjFile({ el: '#test', // 不填则直接默认挂在body上 accept

    1.4K20

    js书写原生ajax,JS 原生ajax写法

    原生ajax 原文链接:http://caibaojian.com/ajax-jsonp.html 一.JS原生ajax ajax:一种请求数据的方式,不需要刷新整个页面: ajax的技术核心是 XMLHttpRe...… JS原生ajax与Jquery插件ajax深入学习 序言: 近来随着项目的上线实施,稍微有点空闲,闲暇之时偶然发现之前写的关于javascript原生xmlHttpRequest ajax方法以及后来...jquery插件ajax方法,于是就行了一些总结,因 … js原生Ajax的封装与使用 一.原生Ajax代码的封装如下: (function() { var XHR = { createStandardXHR...原生ajax 主要复习了php的pdo数据库操作,和js的ajax,真麻烦,希望jquery的ajax简单点. index.php: 1 2 [代码]JS原生Ajax&comma...;GET和POST javascript/js的ajax的GET请求: Jquery学习笔记(10)–ajax删除用户,使用了js原生ajax 主要复习了php的pdo数据库操作,和js的ajax,真麻烦

    15.3K40

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券