ajax上传和下载文件,jq axios和原生ajax实现文件上传和下载,ajax下载二进制文件流

jQuery的ajax下载blob文件 主要介绍了jQuery的ajax下载blob文件的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 立即下载

遇到了一个上传文件和下载文件的业务,利用ajax实现,上传单文件整体上传,不进行分片上传相对简单,这里也暂不讨论大文件分片上传的情况,后面可能会写这个。下载文件如果后端返回链接可以直接赋值给a的href点击或者window.location.href下载,但是后端如果返回的是文件流则需要进行处理再下载。

这里都会用到FormData构造方法,先了解一下FormData:

FormData 接口提供了一种表示表单数据的键值对的构造方式,经过它的数据可以使用 XMLHttpRequest.send() 方法送出,本接口和此方法都相当简单直接。FormData()创建一个新的 FormData 对象。使用formData的append方法将新值追加到FormData对象内的现有键上,或者添加该键(如果该键尚不存在)。

上传文件:jqAjax方法

//上传和文件
function upLoadFile({ url, name = '', data = '', } = {}) {
    if (!url) {
        return;
    }
    let FD = new FormData();
    FD.append(name, data);
    return new Promise((resolve, reject) => {
        $.ajax({
            url: url,
            type: 'POST',
            data: FD,
            processData: false, //很重要,告诉jq不要对data数据进行处理
            contentType: false, //很重要,指定为false才能形成正确的content-type
            success: function(data) {
                resolve(data);
            }
        })
    });
}

上传文件:原生实现

function upLoadFile({ url, name = '', data = '', } = {}) {
    if (!url) {
        throw new Error('the url para is invalid');
    }
    let formData = new FormData();
    formData.append(name, data);

    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('POST', url, true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4 && xhr.status === 200) {
                resolve(xhr.response);
            }
        }

        xhr.send(formData);
    })

}

下载文件的时候,如果后端直接返回的是一个URL链接,那么你直接可以把这个链接赋给a标签的href然后在点击就可以下载了,或者把这个链接赋值给window.location.href即可立即下载。

但是如果后端返回给前端的是二进制格式的文件流,那么前端就需要把这个二进制流进行转换生成URL对象,然后赋值给a标签进行点击触发下载。

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。

下载文件:原生实现:

//下载文件
function downLoadFile({ url, dataSend = {}, fileName = 'name' } = {}) {
    if (!url) {
        throw Error('ajaxData function need a valid url');
    }

    let formData = new FormData();
    for (para in dataSend) {
        formData.append(para, dataSend[para]);
    }

    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('POST', url, true);
        //处理二进制文件流
        xhr.responseType = 'blob';
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4 && xhr.status === 200) {

                let blob = xhr.response;
                if (window.navigator.msSaveOrOpenBlob) { // IE浏览器下,SBIE
                    navigator.msSaveBlob(blob, fileName);
                } else {
                    var link = document.createElement("a");

                    //创建一个新的URL对象,blob是用来创建 URL 的 File 对象或者 Blob 对象​
                    link.href = window.URL.createObjectURL(blob);
                    link.download = fileName;
                    link.click();

                    //释放createObjectURL创建的URL对象
                    window.URL.revokeObjectURL(link.href);
                }

                resolve(xhr.response);

            }
        };
        xhr.send(formData);
    });
}

其实下载文件的时候传递参数的方式可以不使用FormData来创建对象传递,可以直接使用这种格式xhr.send('name=lihua&age=18');这里为了统一使用方式所以使用的FormData()来传递参数。

这里有个坑需要注意一下,我没有写xhr.setRequesHeader("Content-type","...")。因为浏览器会根据你的传递方式进行自动选择。如果我使用FormData传递数据,那么content-type会自动变为:

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryvz9jM571LgaBj0TA

而Content-Type:application/x-www-form-urlencoded; charset=UTF-8是默认的传递格式,但是如果你显示声明了这种传递方式,传递参数的时候就不再是正常看到的表单name:lihua,age:18这种对象格式。从而拿不到数据,这个时候需要将传递参数的方式转为xhr.send('name=lihua&age=18');而不是使用FormData来构造参数传递。

上面我统一用FormData()的原因是因为,这个代码改改,封装一下就可以应对所有的ajax使用状况,所以统一一下会减少今后的疑惑。

axios 下载

post:

download (params, url, name) {
  axios({
    url,
    method: 'post',
    headers: {
      'Content-Type': 'application/json;charset-UTF-8'
    },
    data: params,
    responseType: 'arraybuffer'
  }).then(res => {
    let headers = res.headers;
    let blob = new Blob([res.data], {
      type: headers['content-type']
    });
    let link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    if (!name) {
      const fileName = headers['content-disposition'];
      name = fileName.includes('filename') ? fileName.split('=')[1] : 'download'
    }
    link.download = name;
    let evt = document.createEvent('MouseEvent');
    evt.initEvent('click', true, true);
    link.dispatchEvent(evt);
  })
}

有些后端他写成了get方式,其实也是可以的

download (params, url, name) {
  axios({
    url, // url里面可以拼接参数
    method: 'get',
    headers: {
      'Content-Type': 'application/json;charset=UTF-8'
    },
    params,
    responseType: 'blob' //根据需要定
  }).then(res => {
    let headers = res.headers;
    let blob = new Blob([res.data], {
      type: headers['content-type']
    });
    let link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    if (!name) {
      const fileName = headers['content-disposition'];
      name = fileName.includes('filename') ? fileName.split('=')[1] : 'download'
    }   
    //如果name是乱码则需要先经过escape和decodeURIComponent处理
    name = decodeURIComponent(escape(name));
    link.download = name;
    let evt = document.createEvent('MouseEvent');
    evt.initEvent('click', true, true);
    link.dispatchEvent(evt);
  })
}

 

Ajax请求二进制流进行处理(ajax异步下载文件)的简单方法 最近做项目遇到这样的需求:管理后台需要随时下载数据报表,数据要实时生成后转换为excel下载。怎么解决这个问题呢?下面小编给大家分享Ajax请求二进制流进行处理(ajax异步下载文件)的简单方法,一起看看吧 立即下载

相关推荐

卫星载荷应用方案

本文将从技术和应用层面探讨卫星载荷的应用方案,分析各个领域的特点和挑战,以期为卫星载荷的应用提供一定的指导和参考。卫星载荷应用方案涵盖了通信、地球观测、气象预报、导航定位等诸多领域在每一个领域中,都存在着不同的技术挑战和应用需求。随着技术的进步和需求的变化,卫星载荷应用方案将不断发展和完善,为人类社会的进步和发展做出更大的贡献。用户可以通过接收多颗卫星的信号,计算自身的位置和速度信息。在覆盖扩展方面,可以采用多星座、MEO、GEO 等不同轨道高度的卫星布局,结合卫星的特点和应用需求,实现覆盖范围的扩展。

muyangjun的专栏 904

ajax方式下载文件

前端采用异步方式请求 axios({ method: 'POST', url: this.downTemplateUrl, params: { type: 1 }, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, re...

见贤思齐 2225

高云FPGA开发实战:手把手教你用ModelSim做功能仿真与时序分析(附Testbench写法)

本文详细介绍了高云FPGA开发中如何使用ModelSim进行功能仿真与时序分析,包括环境搭建、Testbench编写、波形调试和时序优化等实战技巧。通过具体案例和代码示例,帮助开发者掌握FPGA仿真验证的核心方法,提升设计可靠性。特别针对高云GW5A系列器件提供了专业的仿真库配置指南和时序分析策略。

weixin_30412167的博客 468

ajax实现文件的下载

在使用下载时,根据需要下载文件的类型修改 type 的值进行下载即可。

YouZi_X的博客 3432

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2287

ROS2实战:手把手教你用CMake集成自定义DDS(以CycloneDDS为例)

本文详细介绍了如何在ROS2中通过CMake集成自定义DDS(以CycloneDDS为例),涵盖环境准备、源码编译、ROS2工作区集成、性能调优及常见问题排查。通过RMW中间件抽象层,开发者可以灵活切换DDS实现,提升系统实时性和可靠性。

weixin_29284201的博客 347

原生AJAX get post下载文件流, post上传文件

【代码】原生AJAX get post下载文件流, post上传文件。

fakuangjingling的博客 1778

FPGA实战:MIG IP核AXI接口DDR3读写优化指南

本文详细解析了FPGA中MIG IP核AXI接口的DDR3读写优化策略,涵盖关键参数配置、突发传输技巧及时序收敛方案。通过AXI接口优化和突发长度选择,可实现高达12.8GB/s的理论带宽,提升DDR3访问效率。文章还提供了Vivado配置实例和调试技巧,助力开发者解决FPGA内存控制中的实际问题。

weixin_29168393的博客 546

后台学习六---ajaxFileupload文件上传下载

这一章讲讲文件的上传下载,这里我们使用ajax的上传文件方法。 ps:基于maven的springmvc框架都已经搭建好了的,如有问题,参考 : 后台学习一—spring+maven+mybatis+mysql+junit整合1. 上传1.1 ajaxFileupload.js具体的功能js都已经封装好了,我们直接把js文件下过来使用,地址: http://download.youkuaiyun.com

lxfHaHaHa的博客 2863

Coze+剪映小助手实战:5分钟搞定视频草稿创建工作流(附常见错误排查)

本文详细介绍了如何利用Coze平台与剪映小助手,通过create_draft接口快速搭建自动化视频草稿创建工作流。文章从核心价值、零基础搭建步骤、运行验证到深度错误排查,手把手教你5分钟内实现视频项目参数预设的标准化与自动化,显著提升短视频创作与团队协作效率。

oil88的博客 549

RK3588平台MIPI DSI屏幕调试记录

本文是基于RK3588平台,MIPI屏调试总结。调试过程中遇到的问题:一开始很久没亮,测量了电源电压和波形都正常。后来换了一组板子和屏幕做对比。最后是因为屏幕的座子没焊接好,二是接MIPI屏幕的排线太长会影响数据传输。换了一根短的线之后屏幕亮起。vp2vp3。

bingdund的博客 1391

后端java返回二进制文件流,vue下载zip包

的确是不难的功能,但是联调了两天没搞好 【如果你遇到了,应该是后端接口流的问题,流正确,收不到数据,就是流类型不对】【因为前端并不需要做什么操作去处理,只需要设置resposeType:blob】 1.没法前后端联调,只能放到服务器上测试【地理原因】 2.请求参数类型不能是json格式,有个参数还是数组类型(使用axios,设置content-type:application/x-www-form-urlencoded,按官方文档说的写的: // headers: { // ...

2号自信的博客 2317

PPT制作能力在职场中真的重要吗?一定要美术功底才能学好PPT吗?

我推出PPT技能培训专栏啦!好的PPT可以让你事半功倍、2023拥有PPT能力还可以让你具备一门极有价值的斜杠能力。更多内容请进:梦幻训练营专栏。专栏内会用本人积累的近10年的PPT学习方法论在短时间内教会你如何制作出精美绝伦的PPT,每篇教程后还会免费赠送一些小福利,不可多得。

打造全国最全的AI Agent开发知识领域的博客 728

通过ajaxFileUpload异步请求上传文件(ajaxFileUpload+servlet实现文件上传下载)

1、最终效果 实现选择图片(此处以图片为例,支持所有类型文件的上传),选择之后将选择的图片在页面中显示出来,点击上传,可以将文件上传到指定的地址中,上传成功后在当前页面自动显示下载标签。 源码下载地址:链接:https://pan.baidu.com/s/17G63S9rkfFIfGBqwCwUHaA 提取码:52b7 2、技术结构 eclipse+servlet+ajaxFileUpload+windows 3、将文件上传下载依赖的包及js文...

雾林小妖的博客 2709

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Ajax、JSON数据和文件上传与下载

JavaWeb一、AJAX二、JSON数据三、文件上传 一、AJAX 二、JSON数据 三、文件上传 每日一点点进步 不进则退

璃尔 ° 的博客 2366

ajax请求二进制流下载文件

转自 :https://www.jb51.net/article/122797.htm 原理:通过a标签来下载文件 代码实现 function download() { var url = 'download/?filename=aaa.txt'; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以...

qq_38000851的博客 1561

jQuery ajax 文件下载

一般上文件下都会使用 window.location.href='xxx' //文件路径或者 后台接口地址  但有时候要传递参数给后台就需要 window.location.href='xxx?name=123&age=234'     如果传参过多或者传参长度过大就有点不太合理了 jQuery.download = function(url, data, method){ // 获得ur

wolf 1万+

模拟ajax提交生成文件流进行下载(未知文件类型,支持所有类型文件直接下载)

/** * 文件下载方法(支持任何格式文件) * fileUrl 文件路径,fileName 下载后的文件新名 */ function fileDownloadFun(fileUrl,fileName) { if("undefined" == typeof fileUrl || !fileUrl){ alert('文件路径不能为空');return false; } let fileUrlArr = fileUrl.split('.'); let fileFix = "unde

weixin_47711357的博客 418

前端Ajax文件流下载及响应头文件名fileName获取

使用ajax下载文件令人头痛欲裂的是fileName文件名的获取,网上寻找各种格式化响应头的方法,奈何五花八门,无一凑效,机缘巧合之下发现axios内部对响应头有做处理,于是火速翻开axios源码浏览借鉴(实则cv)使用a标签下载文件,添加download属性可以自动获取文件名,但需求需要没有文件或者发生错误是给出弹窗提示,a标签下载显然无法实现功能!...

weixin_49258413的博客 5891

$.ajax下载流文件

<body> <div class="wrap"> <div> <p>agent_id:</p> <input type="text" value="" id="agentId"> <p>token:</p> <input type="text" value="" id="token"> </div> <a href="javascri

xjf106的博客 2430

常见Ajax下载文件方式及报错

常见asp.net mvc 文件下载方式及报错

andy5520的博客 5255

使用ajax进行文件下载

使用ajax下载文件 * 定义响应类型为 blob * 拿到响应体后,将其转换为blob对象,通过URL.createObjectURL来创建一个url * 通过a标签的download属性来实现文件下载。const blob = new Blob([result], { type: 'application/octet-stream' });const a = document.createElement('a');a.href = URL.createObjectURL(blob);

jiurikeai的博客 5616

原生JS实现Ajax下载文件

原生JS实现Ajax下载文件 /** * url 下载url * filename 下载文件名称 */ function download(url, filename) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.setRequestHeader('token', $.cookie...

GET知识不迷路,点赞评论加关注! 6490

ajax文件流下载、文件流导入(上传)

1、普通 原文链接请点击 function getExel(url, params, index) {+ return new Promise(function(resolve, reject) { let data = { method: "GET", url:url, headers: { 'token': gettoken("token") }, responseType: 'arraybuffer'

6236

原生Ajax下载流文件

可以正常使用的用法: var url = fileParam.downloadPath; var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); // 也可以使用POST方式,根据接口 xhr.setRequestHeader("Content-Type","application/json;cha...

jonnyha的博客 2492

ajax jquery 下载流文件

ajax jquery 下载流文件

qq_43901960的博客 2550
上一篇: css函数竟然有86个!!!css函数大全
下一篇: 使用webpack4从零开始打包不使用框架的多页面应用,webpack打包多页面应用,使用postcss中px-2-vw实现响应式。
墨语轩
博客等级 码龄8年 206粉丝 208原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值