首页 > 编程语言 >javascript怎么实现文件上传和下载功能

javascript怎么实现文件上传和下载功能

时间:2023-12-15 13:22:39浏览次数:32  
标签:文件 const javascript xhr file console 上传 下载

在现代 Web 开发中,文件上传和下载是经常遇到的需求。JavaScript 作为前端开发的语言之一,提供了许多强大的工具库和 API 来管理文件上传和下载的过程。

本文将探讨如何使用 JavaScript 实现文件上传和下载的功能,首先介绍基于 HTML5 的 File API,然后使用 jQuery 和 XMLHttpRequest 发送 AJAX 请求来实现文件上传和下载。

一、HTML5 的 File API

HTML5 的 File API 可以让 JavaScript 读取和操作本地文件,包括上传和下载。这个 API 包含了 File 和 FileReader 两个对象来解决这些问题。

  1. File 对象

File 对象代表了通过类似输入字段上传的本地文件,这个对象有一系列属性来描述这个文件,例如文件名、大小、类型等。还有一些方法可以用来读取这个文件的内容。

例如:

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

 

<script>

const fileInput = document.getElementById('fileInput')

const file = fileInput.files[0]

console.log(file.name)         // 文件名

console.log(file.size)         // 文件大小

console.log(file.type)         // MIME 类型

</script>

  1. FileReader 对象

FileReader 对象可用来读取文件,并将文件内容存储在内存中以进行进一步处理。有三个事件用于跟踪读取过程:onloadstart、onprogress 和 onl oad。例如:

const fileInput = document.getElementById('fileInput')

const file = fileInput.files[0]

const reader = new FileReader()

 

reader.onload = function() {

    console.log(reader.result)  // 读取完成后的文件内容

}

 

reader.readAsText(file)         // 按文本格式读取文件

二、jQuery 文件上传

jQuery 是一个非常强大的 JavaScript 库,提供了大量功能强大的 API,其中包括 AJAX 请求,使得我们能够使用 JavaScript 实现文件上传。

  1. 基础文件上传

基础文件上传的实现如下:

<!-- HTML 代码 -->

<form enctype="multipart/form-data" id="form">

  <input type="file" name="file" />

  <button type="button" id="upload">上传</button>

</form>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

<script>

  // JavaScript 代码

  $('#upload').click(() => {

    const formData = new FormData($('#form')[0])

    $.ajax({

      url: '/upload',

      type: 'POST',

      cache: false,

      processData: false,

      contentType: false,

      data: formData,

      success: function (res) {

        console.log(res)

      },

      error: function (err) {

        console.log(err)

      },

    })

  })

</script>

上述代码中,我们首先定义了一个 HTML 表单,包含一个文件上传输入框和一个上传按钮。然后使用 jQuery 的 ajax 方法来异步地将表单数据发送到后端进行处理。在发送时,我们需要设置 processData 和 contentType 为 false,以确保 FormData 对象能够正确地发送给服务器,而不会被样式化。

  1. 显示上传进度

要显示文件上传的进度,我们需要做如下更改:

$('#upload').click(() => {

  const formData = new FormData($('#form')[0])

  $.ajax({

    url: '/upload',

    type: 'POST',

    cache: false,

    processData: false,

    contentType: false,

    data: formData,

    xhr: function () {

      const xhr = new window.XMLHttpRequest()

      xhr.upload.addEventListener('progress'function (e) {

        if (e.lengthComputable) {

          const percent = Math.round((e.loaded / e.total) * 100)

          console.log(percent + '%')

        }

      }, false)

      return xhr

    },

    success: function (res) {

      console.log(res)

    },

    error: function (err) {

      console.log(err)

    },

  })

})

上面的代码中,我们将 xhr 函数传递给 ajax 方法,这个函数返回 XMLHttpRequest 对象。然后我们使用 addEventListener 方法来添加 progress 事件监听器,计算出上传进度的百分比并将其打印到控制台上。

三、XMLHttpRequest 文件下载

XMLHttpRequest 是一种可以用于创建客户端的 JavaScript 对象,它可以通过 AJAX 请求来获取服务器数据,也可以用于文件下载。

下面是一个通过 XMLHttpRequest 实现文件下载的示例:

<a href="#" id="download">下载文件</a>

<script>

  $('#download').click(() => {

    const xhr = new XMLHttpRequest()

    xhr.open('GET''/download', true)

    xhr.responseType = 'blob'

    xhr.onload = function (e) {

      if (this.status === 200) {

        const blob = new Blob([this.response], { type: 'application/octet-stream' })

        const link = document.createElement('a')

        link.href = window.URL.createObjectURL(blob)

        link.download = 'file.zip'

        link.click()

      }

    }

    xhr.send()

  })

</script>

上面的代码中,我们创建了一个新的 XMLHttpRequest 对象,并调用 open 方法打开 GET 请求。我们使用 responseType 属性来告诉服务器,期望的响应类型是二进制数据,然后当请求完成时,我们使用 onl oad 事件来处理响应,并将响应的二进制数据转换成 Blob 对象,并创建一个链接以下载文件。

总结

本文主要介绍了如何使用 JavaScript(包括 File API、jQuery 和 XMLHttpRequest)实现文件上传和下载的过程。在实现过程中,需要注意各种情况下的兼容性问题,例如浏览器兼容性,以及表单提交数据的处理和显示进度的方式等。通过了解这些内容,我们可以更好地处理文件上传和下载的需求。

 

参考文章:http://blog.ncmem.com/wordpress/2023/12/15/javascript%e6%80%8e%e4%b9%88%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%92%8c%e4%b8%8b%e8%bd%bd%e5%8a%9f%e8%83%bd/

欢迎入群一起讨论

 

 

标签:文件,const,javascript,xhr,file,console,上传,下载
From: https://www.cnblogs.com/songsu/p/17903186.html

相关文章

  • 用html实现本地文件的上传
    实现本地文件的上传需要使用到HTML5中的FileAPI和FormData对象。以下是一个简单的实现示例:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>文件上传</title></head><body><formid="upload-form"><......
  • c# 本地文件上传到服务器
    1、先把服务器上的路径设置成共享路径2、代码如下stringfileName="5002356611";//替换为你要查找的文件名stringaaa=@"E:\SAP图片";//替换为源文件夹的路径stringb=@"\\173.1.60.169\test";//替换成实际的网络路径(该路径必须是共享文件夹)var......
  • 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-----------------------以上是常规方法,但是我下载了几......
  • 【TFTP】客户端上传文件
    1////客户端上传文件2#include<stdio.h>3#include<string.h>4#include<unistd.h>5#include<arpa/inet.h>6#include<netinet/in.h>7#include<sys/types.h>8#include<sys/stat.h>9#include<fcntl.h&g......
  • 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/......
  • 用JAVA实现大文件上传及显示进度信息
    一. 大文件上传基础描述:各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容。比如:Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息。而.NET 中使用HtmlInputFile/ Ht......
  • PHP复用CURL简单文件上传的2种方法
    方法一:curlFile客户端$filePath='head.txt';//创建CURLFile对象$file=newCURLFile($filePath);//创建cURL资源$ch=curl_init();//设置cURL选项curl_setopt($ch,CURLOPT_URL,$your_upload_url);//替换为实际的上传接口URL......
  • Vue 图片上传formdata()传参形式
    1.接口需要设置 headers:{'Content-Type':'multipart/form-data'}, from-data流的形式传参 2.jshtml://文件上传<divclass="file"><el-buttontype="primary"style="width:170px"icon="el-icon-upload......
  • linux下一键上传markdown文件到博客园
    工具链接dongfanger/pycnblog:博客园上传markdown文件(github.com)这是工具的作者,网址里也有些教程,我这里再把教程写一写,加上自己一些使用的方式。诚挚感谢工具作者的开发贡献!使用指南配置typora用Typora进行编写,需要修改图片的存储方式打开文件>偏好设置,找到'图片插入'......