前端文件下载方式方法总结

使用 jQuery.fileDownload.js 插件实现Ajax下载文件 近期的项目里有一个需求,列表查询模块有个导出按钮,功能很简单,用的是form表单把查询参数提交到后台,提交之后前台给导出按钮添加disable,防止用户重复导出,避免导出的数据量很大的时候给服务器带来不必要的负担.后台根据前台传的查询参数执行条件查询,将查询到的结果集生成Excel用response写到前台直接下载. 做完之后测试大佬提了个BUG,由于Ajax请求无法直接下载文件,所以用的是for... 阅读详情

目录

正文

#传统方法

利用iframe 或 form.submit 或 windows.open直接向后端发请求,后端返回文件流,后端处理成功后会直接返回到页面,浏览器会整理并打开自己的保存下载文件机制 。

回到顶部

1、利用form.submit直接向后端提交,后端返回文件流

  1)前端代码:

 1 var downloadURL = "RestHandle.ashx";
 2 var testForm = $("<form>");   //定义一个form表单
 3 testForm.attr('style','display:none');   //设置form表单属性
 4 testForm.attr('target','');
 5 testForm.attr('method','post');
 6 testForm.attr('action',downloadURL);
 7                     
 8 var nameInput = $('<input>'); //构造formdata
 9 nameInput.attr('type','hidden'); 
10 nameInput.attr('name','fileName'); 
11 nameInput.attr('value','test.txt');  
12  
13 $('body').append(testForm);  //将表单放置在web中
14 testForm.append(nameInput);   //将formdata添加到表单上
15 testForm.submit();   //表单提交
16 testForm.remove();  //表单移除

  2)服务端代码,以asp.net为例:

 1 public class TestHandler : IHttpHandler
 2 {
 3 
 4     public void ProcessRequest(HttpContext context)
 5     {
 6         string fileName = context.Request["FileName"];//客户端传送过来的要下载的文件名
 7         string filePath = System.Web.HttpContext.Current.Server.MapPath("DownLoad/" + fileName);//路径
 8 
 9         FileInfo newFile = new FileInfo(filePath);
10 
11         //以字符流的形式下载文件
12         FileStream fs = new FileStream(filePath, FileMode.Open);
13         byte[] bytes = new byte[(int)fs.Length];
14         fs.Read(bytes, 0, bytes.Length);
15         fs.Close();
16         context.Response.ContentType = "application/octet-stream";
17         //通知浏览器下载文件而不是打开
18         context.Response.AddHeader("Content-Disposition", "attachment;   filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
19         context.Response.BinaryWrite(bytes);
20         context.Response.Flush();
21         context.Response.End();
22     }
23 
24     public bool IsReusable
25     {
26         get
27         {
28             return false;
29         }
30     }
31 }

 3)优缺点:

    优点 :兼容性良好,传统方式,不会出现URL长度限制问题;

    缺点:拿不到后端处理这个过程的时机,无法根据回调函数做交互以及进度提示

2、利于iframe直接向后端提交,后端返回文件流

  1)前端代码:

1 function downFileByIframe(parameters) {
2     var downloadURL = "TestHandler.ashx?FileName=test.txt";
3     var iframe = document.createElement("iframe");
4     iframe.src = downloadURL;
5     iframe.style.display = "none";
6     document.body.appendChild(iframe);
7 }

        2)后端代码:同上

  3)优缺点:

    优点: 兼容性较好

    缺点: *html中会增加多余的iframe元素,增加了维护成本;

           *拿不到后端处理这个过程的时机,无法根据回调函数做交互以及进度提示;

           *URL长度有限制;

3、使用windows.open下载文件

  1)前端代码

1 var downloadURL = "TestHandler.ashx?FileName=test.txt";
2 window.open(downloadURL);

  2)后端代码:同上

  3)优缺点:

    优点:  兼容性良好,代码简洁;

    缺点: *URL长度有限制;

           *拿不到后端处理这个过程的时机,无法根据回调函数做交互以及进度提示;

4、解决“无法根据回调函数做交互”的问题:ajax提交,后端返回在线文件地址

  利用ajax去提交请求,后端会返回一个线上的文件地址,前端可以通过原生的window.open打开这个地址就可以实现下载;

  也可以通过a标签设置href以及download属性,并自动点击实现其下载功能,关于其兼容性问题,可以判断download属性是否存在来弥补。

  1)优缺点:

  优点 :可以拿到其返回时机,可以做交互;

  缺点 :线上产生大量的中间临时文件,可以用设置时限来优化。解决方案:可使用大厂的云存储,从而减少临时文件的产生;

  2)前端代码:

 1 $.ajax({
 2     type: "post",
 3     url: "TestHandler.ashx",
 4     data: {'FileName':'test.txt'},
 5     success: function (res) {
 6         if (res.Status) {
 7             // window.open或者a标签下载 
 8             var isSupportDownload = 'download' in document.createElement('a');
 9             if (isSupportDownload) {
10                 var $a = $("<a>");
11                 $a.attr({
12                     href: res.url,
13                     download: 'filename'
14                 }).hide().appendTo($("body"))[0].click();
15             } else {
16                 window.open(res.url)
17             }
18         } else {
19             alert(res.Message);
20         }
21     }
22 })

 

5、解决“无法根据回调函数做交互”的问题:jquery-download 插件

  jquery.download.js插件github地址:https://github.com/johnculviner/jquery.fileDownload/blob/master/src/Scripts/jquery.fileDownload.js

  jquery.download.js插件cdn地址:https://www.bootcdn.cn/jquery.fileDownload/

  支持场景 : 与上面的几种方案相比,这个模块提供的方案更加完善,而不是局限于某种方案,相当于将上面的几种方案结合了起来, 使用率很高。在源码中,我们可以看到在这个模块中针对各个浏览器和相应的属性是否支持进行了比较全面的兼容。其对应的下载文件方案包括了以下几种。

  • window.open(url)打开某个文件地址
  • iframe的框架中,设置src属性,通过iframe进行文件的下载,支持文件地址
  • 通过form标签,设置action的文件地址,然后通过form的提交来完成文件的下载

   1)前端代码:

1 var downloadURL = "TestHandler.ashx";
 2 $.fileDownload(downloadURL, {
 3     httpMethod: 'post',
 4     data: { 'FileName': 'test.txt' },
 5     prepareCallback: function (url) {
 6         console.log("文件下载中...");
 7         // 数据加载动画
 8         $("body").append('<div id="Loading" style="background:url(images/load.png) top center no-repeat;"></div>');
 9     },
10     abortCallback: function (url) {
11         // 异常终止
12         console.log("文件下载异常!!");
13         $("#Loading").remove();
14     },
15     successCallback: function (url) {
16         console.log("文件下载成功!!");
17         $("#Loading").remove();
18     },
19     failCallback: function (html, url) {
20         console.log("文件下载失败!!");
21         $("#Loading").remove();
22     }
23 });

 

  2)后端代码:

 1 public void ProcessRequest(HttpContext context)
 2 {
 3     string fileName = context.Request["FileName"];//客户端保存的文件名
 4     string filePath = System.Web.HttpContext.Current.Server.MapPath("DownLoad/" + fileName);//路径
 5 
 6     FileInfo newFile = new FileInfo(filePath);
 7 
 8     //以字符流的形式下载文件
 9     FileStream fs = new FileStream(filePath, FileMode.Open);
10     byte[] bytes = new byte[(int)fs.Length];
11     fs.Read(bytes, 0, bytes.Length);
12     fs.Close();
13 
14     context.Response.ContentType = "application/octet-stream";
15     context.Response.AddHeader("Content-Disposition", "attachment;   filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
16     context.Response.BinaryWrite(bytes);
17 
18     //该cookie用于告诉jquery.fileDownload.js文件下载成功
19     context.Response.Cookies.Add(new HttpCookie("fileDownload", "true"));
20     context.Response.Flush();
21     context.Response.End();
22 }

注意: 这里的后端代码增加了一个名为“fileDownload”的cookie的返回;jquery.download.js插件使用该cookie来判断是否下载成功,从而进入成功回调函数(successCallback);

 

#新兴方案

回到顶部

1、利用Html5的download属性进行下载

  1)前端代码

<a href="TestHandler.ashx?FileName=test.txt" download="test1.txt">DownloadAttrTest</a>

  2)后端代码:同上

  3)优缺点:

    优点:代码简洁

    缺点:存在浏览器兼容性的问题

   4)参考:

    https://www.zhangxinxu.com/wordpress/2016/04/know-about-html-download-attribute/

2、利用Html5的Blob对象实现对文件流进行下载

(1)、 使用原生js发送ajax实现

  1)前端代码:

 1 function downByBlob_1(parameters) {
 2     var downloadURL = "TestHandler.ashx?FileName=zip.rar";
 3     let xhr = new XMLHttpRequest()
 4     let fileName = 'zip.rar' // 文件名称 
 5     xhr.open('GET', downloadURL, true);
 6     xhr.responseType = 'arraybuffer';
 7     //xhr.setRequestHeader('xx', 'xxxxx') // 请求头中添加信息
 8     xhr.onload = function () {
 9         if (this.status === 200) {
10             let type = xhr.getResponseHeader('Content-Type')
11 
12             let blob = new Blob([this.response], { type: type })
13             if (typeof window.navigator.msSaveBlob !== 'undefined') {
14                 /*
15                  * IE workaround for "HTML7007: One or more blob URLs were revoked by closing
16                  * the blob for which they were created. These URLs will no longer resolve as 
17                  * the data backing the URL has been freed." 
18                  */
19                 window.navigator.msSaveBlob(blob, fileName);
20             } else {
21                 let URL = window.URL || window.webkitURL;
22                 let objectUrl = URL.createObjectURL(blob);
23                 console.log(objectUrl);
24                 //"blob:http://localhost:10614/3e48b856-fca6-4e4c-b780-1c4a7066f42e"
25                 if (fileName) {
26                     var a = document.createElement('a');
27                     // safari doesn't support this yet
28                     if (typeof a.download === 'undefined') {
29                         window.location = objectUrl
30                     } else {
31                         a.href = objectUrl;
32                         a.download = fileName;
33                         document.body.appendChild(a);
34                         a.click();
35                         a.remove();
36                     }
37                 } else {
38                     window.location = objectUrl;
39                 }
40             }
41         }
42     }
43     xhr.send();
44 }

   2)后端代码:同上

(2)、 使用结合jq发送ajax请求实现,需要引入jquery.binarytransport.js插件,其扩展了jq的ajax的dataType的设置;

  jquery.binarytransport.js插件github地址:https://github.com/henrya/js-jquery/tree/master/BinaryTransport

  注意:当下载的是纯文本文件时,是不需要引入插件,ajax也不用配置dataType,直接用jq的ajax即可;

  1)前端代码:

 1 function downByBlob_2(parameters) {
 2     $.ajax({
 3         type: "post",
 4         url: "TestHandler.ashx",
 5         data: { 'FileName': 'zip.rar' },
 6         dataType: 'binary',
 7         responseType: 'arraybuffer',
 8         success: function (msg) {
 9             let blob = new Blob([msg]);
10 
11             console.log("Blob:" + msg); //msg 已不是乱码
12             let url = window.URL.createObjectURL(blob); 
13 
14             let a = document.createElement("a");
15             document.body.appendChild(a);
16             a.href = url;
17             a.download = 'zip.rar'; //命名下载名称
18             a.click(); //点击触发下载  
19             window.URL.revokeObjectURL(url); //下载完成进行释放
20         }
21     });
22 }

        2)后端代码:同上

   3)参考:  

    http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/

    https://blog.youkuaiyun.com/aydongzhiping/article/details/82462473

3、新兴方案中的综合方案:file-saver

(1)、FileSaver.js 功能特点

  • FileSaver.js 是一款基于 HTML5 完成文件保存的插件,它可以帮我们直接从网页中导出多种格式文件。
  • 同时对于那些本身不支持 HTML5 W3C saveAs() FileSaver 接口的浏览器,FileSaver.js 也提供了支持。
  • 使用 FileSaver.js 可以让 Web 应用完美的生成文件,或者保存那些不应该发送到外部服务器的敏感信息。是一种简单易用的浏览器端文件保存方案。

(2)、安装

  FileSaver.js  github地址:https://github.com/eligrey/FileSaver.js

  可直接下载 FileSaver.js 然后在页面中引用;

  npm、bower 安装:

npm install file-saver --save
bower install file-saver

(3)、demo:使用 FileSaver.js下载后端返回的文件流;

  1)前端代码:

1  function downByFileSaver(parameters) {
2     saveAs('TestHandler.ashx?FileName=zip.rar');
3 }

     2)后端代码:同上

回到顶部

4、新兴方案的优缺点:

  优点:技术新颖,某些场景下使用方便;

  缺点:兼容性不好;

5.使用 javascript API -- fetch 实现文件下载功能

 前端代码:

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.blob())
  .then(blob => {
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    // the filename you want
    a.download = 'todo-1.json';
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
    alert('your file has downloaded!'); // or you know, something with better UX...
  })
  .catch(() => alert('oh no!'));

  后端代码同上

#参考

  https://juejin.im/post/5bd5547a6fb9a05cdd2d5109

  https://juejin.im/post/5bd1b0aa6fb9a05d2c43f004

  https://www.cnblogs.com/yunser/p/7629399.html

  https://blog.youkuaiyun.com/wt346326775/article/details/83617663

前端使用XMLHttpRequest实现通过链接下载文件 前端使用XMLHttpRequest实现通过链接下载图片 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> ... 阅读详情

相关推荐

前端实现文件下载的方法

小菜鸟在熬夜

MoXinXueWEB的博客 1万+

jQuery 使用fileDownload组件实现文件下载

1 需要引入的JS jquery.fileDownload.min.js 2 实现代码 //文件下载 function FileDownload(){ $.fileDownload(location.href, { httpMethod: 'POST', data: {}, prepareCallback: function (url) { alert("开始准备调用后台接口"); },

旭东怪的博客 4466

前端大文件下载方案

前端大文件下载方案 文章目录前端大文件下载方案JSZipStreamSaver.js与 JSZip 结合使用?mitm + sw 配置 tags: Streams API Service Worker StreamSaver.js JSZip 在业务中遇到需要用户下载一个很巨大的 zip 包的场景,内容通常是一堆很小的(图片)文件打包到一起。传统的下载方案是直接修改 window.location.href=后端提供的下载链接,之后后端一边去下载要打包的文件,一边把打包好的东西写入这个链接。 存在的

azurecho 1万+

jquery.fileDownload.js使用

jquery.fileDownload.js 1,简短说明 使用 jquery.fileDownload.js 增加前后端交互友好性 2,实例 filedownload组件HTML部分: <div class="download-container"> <!--初始化时显示--> <nz-dropdown *ngIf="!creatFileIng"> <button nz-button nzType="primary" .

Ben_Simons 3310

jQueryFileDownload实现ajax下载体验的jQuery插件

jQuery File Download实现ajax下载体验的jQuery插件

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 187

前端常用方法之图片文件下载方式

文章目录前言一、下载哪种类型的文件?二、代码 前言 提示:记录前端常用的文件下载方式 一、下载哪种类型的文件? 比如图片、文本等 二、代码 代码如下(示例): handleDown(row){ const imageType = /.(jpg|jpeg|png|bmp)$/; const fileName = row.name || row.name2 if(fileName && imageType.test(fileName.trim().toLowerCase()

small_IT_lang的博客 386

告别专业软件!用QGIS+GDAL免费搞定S-57电子海图,附全套符号库和样式文件

本文详细介绍了如何利用免费开源工具QGIS和GDAL处理S-57电子海图,包括数据转换、符号库配置和专业可视化方案。通过实战指南,用户无需依赖昂贵的商业软件,即可实现从S-57到SHP的转换及专业级海图制作,特别适合预算有限的个人和小型机构。

weixin_33701294的博客 391

盘点5种前端常见的文件下载方式

下载文件

weixin_40057800的博客 1493

STM32+LoRa模块实战:从环境搭建到数据传输完整指南(附避坑清单)

本文提供STM32与LoRa模块从环境搭建到数据传输的完整实战指南,涵盖硬件连接、开发环境配置、AT指令设置、频段优化及低功耗设计等关键步骤,特别针对常见问题提供解决方案和避坑清单,助力物联网开发者高效实现远距离低功耗通信。

weixin_29168813的博客 289

逆向工程实战:解密AppleAccount的X-MMe-Nas-Qualify签名生成机制

本文通过逆向工程实战,详细解析了AppleAccount服务中X-MMe-Nas-Qualify签名的生成机制。作者利用Frida进行动态追踪定位签名源头,结合IDA Pro进行静态分析,并借助LLDB动态调试还原核心算法。文章最终分享了如何独立于苹果官方库,通过Python代码复现签名算法,为自动化测试和深度交互苹果服务的开发者提供了关键技术路径。

weixin_29323049的博客 706

前端文件下载方式总结

平时开发中我们很多时候都会要用到文件下载,所以总结了一下平时常用得一些一些下载方法。 1、文件流二进制 // 在请求的时候加上getResponse 为true ,这样就可以得到头部信息,通过头部信息就可以拿到后台返回得文件名 /** * @param {String} res 二进制流 * @param {String} name下载文件名称(可传可不传) */ export function use_flow_download(res: any, name?: string) { if (

weixin_49115151的博客 312

Cadence仿真笔记(二):传统noise仿真—共源极的噪声

cadence中进行传统噪声仿真

Bao_xue的博客 1万+

前端实现文件下载的几种方法

前端实现文件下载的几种方法

weixin_69174819的博客 7804

AWS RDS 介绍 三)创建 RDS 实例

AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.

XuYongshi02的专栏 7645

甲基化生物信息学分析及批次效应校正全流程

本文系统阐述了DNA甲基化数据分析中的批次效应问题及解决方案。甲基化数据(β值和M值)对实验批次差异高度敏感,可能导致假阳性结果。文章详细介绍了批次效应检测方法(PCA可视化、BEclear定量评分)和校正流程,包括数据预处理、参数化(ComBat-met)与非参数化(BEclear)校正方法,并提供了完整的R代码实现。重点解决了β值有界分布与统计模型假设冲突的问题,为甲基化研究的可靠性提供技术保障。

huanghm88的专栏 105

前端导出文件,下载文件,downloadFile 方法汇总

直接设置标签的href属性:适用于简单的文件下载。使用fetchAPI 下载 Blob 文件:适用于需要处理文件内容的情况。使用表单提交:适用于需要携带参数或进行 POST 请求的情况。使用iframe触发下载:适用于不需要用户交互的文件下载。使用下载 Blob 文件:适用于需要兼容旧浏览器的情况。使用Blob和库:适用于需要简化文件下载操作的情况。

m0_74823434的博客 648

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 698

前端POST请求下载文件

下载文件功能(前端调用后台接口实现) 接口没有设置相关的token(有些接口设计中需要在请求头中设置headers: { ‘Content-Type’: ‘application/json;charset=utf-8’, Authorization: token, }) // get请求最简单的下载文件的方式 window.location.herf = `https://app.conv......

weixin_41552521的博客 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

前端兼容IE的下载文件方法

上个星期碰到了在IE浏览器上无法下载文件但是在谷歌上面却可以的问题,下面是我的代码: function fetchPost(url, data, fileName) { fetch(url, { method: 'POST', body: data, }) .then(response => { if (response.ok)...

liuyuhua666的博客 1633

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

vue3 下载文件方式(包括通过url下载文件并修改文件名称,和文件流下载方式)

vue3 文件下载方式(包括通过url下载文件 修改文件名称,和文件流下载方式)

记不住代码的前端混子 532

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

vue 后台返回的文件流进行预览_vue中后端做Excel导出功能返回数据流前端的处理操作...

项目中有一个导出功能的实现,用博客来记录一下。因为需求对导出表格的数据格式和样式有要求,所以这个导出功能放到后端来做,而且后端返回的是数据流,所以需要处理成想要的表格并导出来。先看下效果图:页面效果:点击 导出Excel 调用导出接口成功了:后台返回的数据流,一堆看不懂的乱码:接下来要处理这堆乱码,因为用到的地方多,所以在util.js文件里封装了一个公共方法并抛出:虽然vue里有封装好的请求接口...

weixin_34006342的博客 2087

前端a链接读取txt文件导出下载_前端 javascript 实现文件下载

在 html5 中,a 标签新增了 download 属性,包含该属性的链接被点击时,浏览器会以下载文件方式下载 href 属性上的链接。示例:下载1. 前端 js 下载实现与示例通过 javascript 动态创建一个包含 download 属性的 a 元素,再触发点击事件,即可实现前端下载。代码示例:function download(href, title) {const a = docum...

weixin_39851008的博客 673

前端实现文件下载常用几种方式

前端对应的实质是a标签和Blob文件下载,这两者的区别:a标签:txt、png、jpg、gif等文件,是不提供直接下载,有兼容性问题,特别是IE。blob:利用 Blob对象可以将文件流转化成 Blob二进制对象。该对象兼容性良好,适用于需要动态生成或处理非同源文件的情况。‌通过URL.createObjectURL()方法将Blob对象转换为一个临时的URL下载。blob对象Blob对象表示一个不可变、原始数据的类文件对象。

小李在努力学习 1635

前端下载的方法实现

文件下载

m0_47688525的博客 162

vue前端实现上传文件,vue 上传文件

" size="small" type="success" @click="submitUpload">上传到服务器选取文件responseType: "blob" // 表明返回服务器返回的数据类型。

Mr_Zang666的博客 2042
上一篇: 使用Spring @DependsOn控制bean加载顺序
下一篇: 解决stackOverflow打开慢的问题.
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值