JavaScript 文件上传

科技资讯 投稿 22800 0 评论

JavaScript 文件上传

一、普通文件上传

<input type="file" id="fileInput">

然后,在 JavaScript 中获取文件输入框的引用,并在其上设置事件监听器,如下所示:

var fileInput = document.getElementById('fileInput';
fileInput.addEventListener('change', function ( {
  // 在这里处理选择的文件
};

在事件监听器中,可以使用 fileInput.files[0] 属性获取选择的文件,然后对文件进行处理。

XMLHttpRequest 或 fetch API 来上传文件。

XMLHttpRequest:

var file = fileInput.files[0];
var formData = new FormData(;
formData.append('file', file;

var xhr = new XMLHttpRequest(;
xhr.open('POST', 'url', true;
xhr.onload = function ( {
  if (xhr.status === 200 {
    console.log('upload success';
  }
};
xhr.send(formData;

使用 fetch

var file = fileInput.files[0];
var formData = new FormData(;
formData.append('file', file;

fetch('url', {
  method: 'POST',
  body: formData
}.then(response => {
  if (response.ok {
    console.log('upload success';
  }
};

另外还可以使用第三方库如 axios 来实现文件上传,具体实现方法可以参考相关文档。

二、大文件上传

分块上传的方式。将大文件分成若干个块,每块一个 HTTP 请求上传。

    用户选择文件。
  1. 将文件分成若干块。
  2. 对于每一块,向服务器发送 HTTP 请求上传。
  3. 服务器接收到文件块后,将其存储在服务器上。
  4. 在所有块上传完成后,服务器将所有块合并成一个完整的文件。

JavaScript 可以使用 File API(File 和 Blob 对象)来实现文件的读取和上传。

<input type="file" id="file-input">

 

// 上传文件块
function uploadChunk(file, start, end, chunk {
    var xhr = new XMLHttpRequest(;
    xhr.open('POST', '/upload', true;
    xhr.setRequestHeader('Content-Type', 'application/octet-stream';
    xhr.setRequestHeader('Content-Range', 'bytes ' + start + '-' + end + '/' + file.size;
    xhr.send(chunk;
}

// 上传文件
function uploadFile(file {
    var chunkSize = 1 * 1024 * 1024; // 分块大小为1MB
    var chunks = Math.ceil(file.size / chunkSize; // 计算分块数
    var currentChunk = 0; // 当前分块
    var start, end;
    while (currentChunk < chunks {
        start = currentChunk * chunkSize;
        end = start + chunkSize >= file.size ? file.size : start + chunkSize;
        var chunk = file.slice(start, end;
        uploadChunk(file, start, end, chunk;
        currentChunk++;
    }
}

// 监听文件选择事件
document.getElementById('file-input'.addEventListener('change', function(e {
    var file = e.target.files[0];
    if (file {
        uploadFile(file;
    }
};

在这个实例中,我们使用了 XMLHttpRequest 对象上传文件,并设置了 Content-Type 和 Content-Range 消息头。Content-Type 消息头表示上传的数据类型是二进制数据,Content-Range 消息头表示上传的文件块的范围。

注意,这只是一个简单的实例,代码仅供参考,在实际应用中还需要考在考虑以下几点:

    如果服务器端支持断点续传,可以在服务器端记录已经上传的文件块,避免重复上传。
  • 需要考虑如何处理上传失败的文件块,是否需要重试。
  • 在上传过程中需要提供进度条,让用户了解上传进度。
  • 在上传完成后需要有反馈,告知用户上传是否成功。
  • 服务器端如何处理上传的文件块,将其合并成一个完整的文件。
  • 服务器端存储空间的问题。可以使用分布式文件系统(如 HDFS)或云存储(如 Amazon S3)来存储上传的文件。
  • 文件块上传顺序、文件块校验、断点续传等问题。

 

    resumable.js
  • plupload
  • fine-uploader
  • tus-js-client

这些库都提供了文件分块、断点续传、上传进度等功能,可以让你更快捷地实现大文件上传。

 

关于文件上传需要了解的知识点:

    HTML5 文件上传
  • 文件上传技术
  • 文件上传安全性
  • 分块上传
  • 断点续传
  • 云存储

编程笔记 » JavaScript 文件上传

赞同 (119) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽