支持断点续传的多文件上传开发控件

    应用iWebFile2005控件,能够非常方便的开发多文件上传,  支持大文件上传(大于50M以上)和断点续传的程序.
下载地址: http://www.goldgrid.com/Products/CView.asp?id=82

客户端程序
<%
  Response.buffer=true
  mScriptName="iWebClient.asp"
  mServerName="iWebServer.asp"
  mHttpUrl="http://" & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("SCRIPT_NAME")
  mHttpUrl=Left(mHttpUrl,Len(mHttpUrl)-Len(mScriptName))
  mServerUrl=mHttpUrl & mServerName
%>

<HTML>
<HEAD>
<TITLE>iWebFile2005文档上传下载管理软件 </TITLE>
</HEAD>

<script language="javascript">
    function CheckFileExists(FileName){
 if (iWebFile.WebCheckFile('C://iWebFile//'+FileName)){
  return true;
 }else{
     iWebFile.WebUrl='<%=mServerUrl%>';
            iWebFile.MkDirectory('C://iWebFile');
            if (iWebFile.WebGetFile('C://iWebFile//'+FileName,FileName)){
                return true;
            }else{
                alert(iWebFile.MsgError());
                return false;
     }
 }
    }

    function LoadDocument(FileName){
 iWebFile.WebUrl='<%=mServerUrl%>';
        iWebFile.MkDirectory('C://iWebFile');
        if (iWebFile.WebGetFile('C://iWebFile//'+FileName,FileName)){
            return true;
        }else{
            alert(iWebFile.MsgError());
            return false;
 }
    }

    function OpenDocument(FileName){
        var ClientName,ClientParam,ClientPath,ClientStatus,Result;
 try
 {
     if (LoadDocument(FileName)){
                 ClientName='C://iWebFile//'+FileName;
                 ClientParam='';
                 ClientPath='C://iWebFile';
   ClientStatus=2;
   Result=iWebFile.WebExecute(ClientName,ClientParam,ClientPath,ClientStatus);
    }
 }
 catch(e)
 {
  alert(e.toString()+"/r/n未安装iWebFile插件/r/n请在打开本页面的弹出窗口时,选择[是]按钮,才能正常运行!");
 }
 return;
    }

    function SaveDocument(FileName){
 if (iWebFile.WebCheckFile('C://iWebFile//'+FileName)){
     iWebFile.WebUrl='<%=mServerUrl%>';
            if (iWebFile.WebPutFile('C://iWebFile//'+FileName,FileName)){
         iWebFile.WebDeleteFile('C://iWebFile//'+FileName);
                alert("文件保存成功!");
            }else{
                alert(iWebFile.MsgError());
     }
 }else{
            alert("文件C://iWebFile//"+FileName+"没有找到!");
        }
    }

    function GetServerTime(){
 iWebFile.WebUrl='<%=mServerUrl%>';
        iWebFile.SetMsgByName("FUNCTION","GETSERVERTIME");
        iWebFile.SetMsgByName("STRING",t.value);
        if (iWebFile.MsgSend()){
     st.innerText=iWebFile.GetMsgByName("SERVERTIME");
        }else{
            alert(iWebFile.MsgError());
 }
    }

    function RunServerFunction(){
 iWebFile.WebUrl='<%=mServerUrl%>';
        iWebFile.SetMsgByName("FUNCTION","RUNSERVERFUNCTION");
        iWebFile.SetMsgByName("A",a.value);
        iWebFile.SetMsgByName("B",b.value);
        if (iWebFile.MsgSend()){
     js.innerText=iWebFile.GetMsgByName("RESULT");
        }else{
            alert(iWebFile.MsgError());
 }
    }

    function UpLoadFile(file){
 var FileName;
 //取得需要上传的文件名
 FileName=file.substring(file.lastIndexOf("//")+1);
 //检测文件是否存在
 if (iWebFile.WebCheckFile(file)){
     iWebFile.WebUrl='<%=mServerUrl%>';
     //如果需要保存到其他目录,可以在此设置路径参数.
     //例如:
     //iWebFile.SetMsgByName("FILEPATH","myfile");
     //在服务器上就可以通过GetMsgByName("FILEPATH"),取得文件保存路径myfile,然后进行保存操作

            if (iWebFile.WebPutFile(file,FileName)){
                alert("文件保存成功!");
                location.href="<%=mScriptName%>";
            }else{
                alert(iWebFile.MsgError());
     }
 }else{
            alert("文件"+file+"没有找到!");
        }
    }
    function WebSelectFile(){
 iWebFile.WebUrl='<%=mServerUrl%>';
        if (iWebFile.WebSelectFile()){
                alert("文件保存成功!");
                location.href="<%=mScriptName%>";
        }else{
                alert(iWebFile.MsgError());
 }
    }
    function WebExecute(FileName){
        var ClientName,ClientParam,ClientPath,ClientStatus,Result;
 try
 {
         ClientName=FileName;
         ClientParam='';
         ClientPath='';
   ClientStatus=0;
   Result=iWebFile.WebExecute(ClientName,ClientParam,ClientPath,ClientStatus);
 }
 catch(e)
 {
  alert(e.toString()+"/r/n未安装iWebFile插件/r/n请在打开本页面的弹出窗口时,选择[是]按钮,才能正常运行!");
 }
 return;
    }


    function WebRunServer(FileName){
        var ClientName,ClientParam,ClientPath,ClientStatus,Result;
 try
 {
     if (CheckFileExists(FileName)){
                 ClientName='C://iWebFile//'+FileName;
                 ClientParam='';
                 ClientPath='C://iWebFile';
   ClientStatus=0;
   Result=iWebFile.WebExecute(ClientName,ClientParam,ClientPath,ClientStatus);
    }
 }
 catch(e)
 {
  alert(e.toString()+"/r/n未安装iWebFile插件/r/n请在打开本页面的弹出窗口时,选择[是]按钮,才能正常运行!");
 }
 return;
    }
</script>
<BODY>
<DIV align="center"><font size=5 color=ff0000>iWebFile2005文档上传下载管理软件</font></div><br>
<div  width=80%>
系统特点:<br>
&nbsp;&nbsp;&nbsp;&nbsp;1、支持大文件上传(大于50M以上)和断点续传;<br>
&nbsp;&nbsp;&nbsp;&nbsp;2、支持指定文件名上传到服务器上、支持选定多文件上传;<br>
&nbsp;&nbsp;&nbsp;&nbsp;3、支持下载服务器指定文件到客户端指定目录下;<br>
&nbsp;&nbsp;&nbsp;&nbsp;4、支持运行客户端应用程序,并能够传递参数给应用程序;<br>
&nbsp;&nbsp;&nbsp;&nbsp;5、支持下载指定网页或图片并保存到本地目录中。<br>
&nbsp;&nbsp;&nbsp;&nbsp;6、配合文件下载和运行客户端程序功能,能够达到运行服务器上的应用程序的目的;<br>
&nbsp;&nbsp;&nbsp;&nbsp;7、配合文件下载和运行客户端程序和指定文件上传功能,能够达到将直接修改服务器文件的目的;<br>
&nbsp;&nbsp;&nbsp;&nbsp;8、支持强大的通讯功能,可以随时和服务器进行数据传递;<br>
&nbsp;&nbsp;&nbsp;&nbsp;9、支持asp,jsp,php,.net等多种平台;<br>
&nbsp;&nbsp;&nbsp;&nbsp;10、本软件非常适合网络文档的管理。<br>
<br></div>
<DIV align="center">
<table border=1 width=80% >
   <tr>
       <td colspan=3 bgcolor=menu>(标准方式)文件上传功能演示</td>
   </tr>
   <tr>
       <td colspan=2 nowrap>文件名:<input id=fa type=file value="" style=width:80%></td>
       <td><input type=button οnclick="UpLoadFile(fa.value)" value="上传文档"></td>
   </tr>
   <tr>
       <td colspan=3 bgcolor=menu>(指定方式)文件上传功能演示</td>
   </tr>
   <tr>
       <td colspan=2 nowrap>文件名:<input id=fb type=text value=""  style=width:80%></td>
       <td><input type=button οnclick="UpLoadFile(fb.value)" value="上传文档"></td>
   </tr>
   <tr>
       <td colspan=3 bgcolor=menu>(选定多文件)上传功能演示</td>
   </tr>
   <tr>
       <td colspan=2 nowrap>请按右边的[上传多文档]按钮,选择你要上传的文件.</td>
       <td><input type=button οnclick="WebSelectFile();" value="上传多文档"></td>
   </tr>
   <tr>
       <td colspan=3 bgcolor=menu>打开本地程序功能演示</td>
   </tr>
   <tr>
       <td colspan=2 nowrap>请按右边的按钮.</td>
       <td><input type=button οnclick="WebExecute('calc.exe');" value="运行计算器"></td>
   </tr>
   <tr>
       <td colspan=2 nowrap>请按右边的按钮.</td>
       <td><input type=button οnclick="WebExecute('mspaint.exe');" value="运行画笔"></td>
   </tr>
   <tr>
       <td colspan=3 bgcolor=menu>运行服务器上的程序功能演示</td>
   </tr>
   <tr>
       <td colspan=2 nowrap>请按右边的按钮.</td>
       <td><input type=button οnclick="WebRunServer('Test.exe');" value="运行远程程序"></td>
   </tr>
   <tr>
       <td colspan=3 bgcolor=menu>交互通讯功能演示</td>
   </tr>
   <tr>
       <td><div id=st>&nbsp;</div></td>
       <td colspan=2><input id=t type=text value="服务器时间是:" size=9><input type=button οnclick="GetServerTime()" value="取服务器时间"></td>
   </tr>
   <tr>
       <td><div id=js>&nbsp;</div></td>
       <td colspan=2><input id=a type=text value="4" size=3>*<input id=b type=text value="6" size=3><input type=button οnclick="RunServerFunction()" value="让服务器计算"></td>
   </tr>
   <tr>
       <td colspan=3 bgcolor=menu>文件处理功能演示</td>
   </tr>

<%
  DBStr="DBQ=" & Server.mappath("FileName.mdb") & ";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;"
  Set DBDemo=Server.CreateObject("ADODB.Connection")
  DBDemo.Open DBStr

  Set TbMainRs=Server.CreateObject("ADODB.RecordSet")       '创建页面显示
  TbMainRs.Open "select * from FileList order by FileID desc",DBDemo,1,1   '打开数据库
  Do While Not TbMainRs.Eof              '当没有显示到最后一条记录或没有显示RowCount记录时

%>
   <tr>
       <td width=80%><%=TbMainRs("FileName")%>&nbsp;</td>
       <td width=80><input type=button οnclick="OpenDocument('<%=TbMainRs("FileName")%>')" value="打开文档"></td>
       <td width=80><input type=button οnclick="SaveDocument('<%=TbMainRs("FileName")%>')" value="保存文档"></td>
   </tr>
<%
     TbMainRs.MoveNext
  Loop
  TbMainRs.Close
  Set TbMainRs=Nothing
  DBDemo.Close
  Set DBDemo=Nothing
%>
   <tr>
       <td width=80%>MOD00001.DOC</td>
       <td width=80><input type=button οnclick="OpenDocument('MOD00001.DOC')" value="打开文档"></td>
       <td width=80><input type=button οnclick="SaveDocument('MOD00001.DOC')" value="保存文档"></td>
   </tr>
   <tr>
       <td>Mod00001.xls</td>
       <td><input type=button οnclick="OpenDocument('Mod00001.xls')" value="打开文档"></td>
       <td><input type=button οnclick="SaveDocument('Mod00001.xls')" value="保存文档"></td>
   </tr>
   <tr>
       <td>金格公司演示文档.ppt</td>
       <td><input type=button οnclick="OpenDocument('金格公司演示文档.ppt')" value="打开文档"></td>
       <td><input type=button οnclick="SaveDocument('金格公司演示文档.ppt')" value="保存文档"></td>
   </tr>
   <tr>
       <td>DBstep.mdb</td>
       <td><input type=button οnclick="OpenDocument('DBstep.mdb')" value="打开文档"></td>
       <td><input type=button οnclick="SaveDocument('DBstep.mdb')" value="保存文档"></td>
   </tr>
   <tr>
       <td>传真资料.tif</td>
       <td><input type=button οnclick="OpenDocument('传真资料.tif')" value="打开文档"></td>
       <td><input type=button οnclick="SaveDocument('传真资料.tif')" value="保存文档"></td>
   </tr>
   <tr>
       <td>名片.bmp</td>
       <td><input type=button οnclick="OpenDocument('名片.bmp')" value="打开文档"></td>
       <td><input type=button οnclick="SaveDocument('名片.bmp')" value="保存文档"></td>
   </tr>
   <tr>
       <td>普通文本文件.txt</td>
       <td><input type=button οnclick="OpenDocument('普通文本文件.txt')" value="打开文档"></td>
       <td><input type=button οnclick="SaveDocument('普通文本文件.txt')" value="保存文档"></td>
   </tr>
   <tr>
       <td>goldgridLogo.psd</td>
       <td><input type=button οnclick="OpenDocument('goldgridLogo.psd')" value="打开文档"></td>
       <td><input type=button οnclick="SaveDocument('goldgridLogo.psd')" value="保存文档"></td>
   </tr>
   <tr>
       <td colspan=3 bgcolor=menu>
 <OBJECT id="iWebFile" classid="clsid:074106C0-5E71-4151-9CE8-9B024485B58F" codebase="iWebFile2005.ocx#version=5,6,0,4" width=100% height=24 >
 </OBJECT>
       </td>
   </tr>
</table>
</div>

</BODY>
</HTML>

服务器程序
<%
function SaveFileName(vFileName)
  DBStr="DBQ=" & Server.mappath("FileName.mdb") & ";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;"
  Set DBDemo=Server.CreateObject("ADODB.Connection")
  DBDemo.Open DBStr
  DBSql = "select * from FileList where FileName = '" & vFileName & "'"
  Set TbMain=Server.CreateObject("ADODB.RecordSet")       '创建页面显示
  TbMain.Open DBSql,DBDemo,1,3   '打开数据库
  if TbMain.eof then
     TbMain.AddNew
  end if
  TbMain("FileName")=vFileName
  TbMain.Update
  TbMain.Close
  Set TbMain=Nothing
  DBDemo.Close
  Set DBDemo=Nothing
  SaveFileName=True
end function

Set FileObj=Server.CreateObject("DBstep.MsgServer2000")  '创建信息包对象
if (FileObj.GetMsgByName("DBSTEP")="DBSTEP") then  '如果是合法的信息包
  mOption=FileObj.GetMsgByName("OPTION")   '取得操作信息
  mFilePath=Server.mappath(".") & "/Document"
  select case mOption
    case "WEBGETFILE"      '打开服务器里的文件
             mFileName=FileObj.GetMsgByName("FILENAME")  '取得文档名
      if FileObj.MsgFileLoad(mFilePath & "/" & mFileName) then '调入文档
        FileObj.SetMsgByName "STATUS","打开成功!" '设置状态信息
        FileObj.MsgError=""    '清除错误信息
      else
        FileObj.MsgError="打开失败!"   '设置错误信息
      end if
    case "WEBPUTFILE"      '保存文件在服务器里
             mFileName=FileObj.GetMsgByName("FILENAME")  '取得文档名
             mCommand=FileObj.GetMsgByName("COMMAND")
      select case mCommand
  case "BEGIN"
                     mFilePoint=FileObj.LoadFilePoint(mFilePath & "/" & mFileName)
       FileObj.SetMsgByName "FILEPOINT",mFilePoint
              FileObj.MsgError=""       '清除错误信息
  case "SAVEFILE"
       mIndex=FileObj.GetMsgByName("INDEX") 
       mTotal=FileObj.GetMsgByName("TOTAL") 
       if FileObj.MsgFileSave(mFilePath & "/" & mFileName & "." & mIndex) then '保存临时文档
   if FileObj.SaveFilePoint(mFilePath & "/" & mFileName,mIndex) then
           FileObj.MsgError=""      '清除错误信息
   else
    FileObj.MsgError="保存状态文件失败!"    '清除错误信息
   end if
       else
          FileObj.MsgError="保存断点文件失败!"     '设置错误信息
       end if
  case "END"
       mIndex=FileObj.GetMsgByName("INDEX") 
       mTotal=FileObj.GetMsgByName("TOTAL") 
       if FileObj.SaveFromFile(mFilePath & "/" & mFileName,mTotal) then  '保存文档
                 SaveFileName mFileName
          FileObj.MsgError=""       '清除错误信息
       else
          FileObj.MsgError="合成文件失败!"     '设置错误信息
       end if
      end select
      FileObj.MsgFileClear    '清除文档内容
    case "MSGSEND"
             mFunction=FileObj.GetMsgByName("FUNCTION")  '取得功能名称
      if mFunction="GETSERVERTIME" then   '处理取得服务器时间请求
  mString=FileObj.GetMsgByName("STRING")
         mDateTime=CDate(now())
  FileObj.SetMsgByName "SERVERTIME",mString  & mDateTime
         FileObj.MsgError=""    '清除错误信息
      end if
      if mFunction="RUNSERVERFUNCTION" then  '处理取得服务器计算请求
  mA=FileObj.GetMsgByName("A")
  mB=FileObj.GetMsgByName("B")
         mC=Cint(mA)*Cint(mB)
  FileObj.SetMsgByName "RESULT",CStr(mC)
         FileObj.MsgError=""    '清除错误信息
      end if
    case else
      FileObj.SetMsgByName "STATUS","Option错误:" & mOption '设置状态信息
      FileObj.MsgError="Option错误:" & mOption     '设置错误信息
  end select
else
  FileObj.MsgError="客户端发送数据包错误!"
  FileObj.MsgTextClear
  FileObj.MsgFileClear
end If

Response.BinaryWrite FileObj.MsgVariant
Set FileObj=nothing

%>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
现在大部分的网站使用的是标准HTML的上传方式来上传文件。一般情况下标准HTML方式在网页中只能上传4MB左右的文件,如果访问的用户比较多的时侯这种方式容易上传失败。虽然标准HTML上传方式开发起来比较简单,但是这种方式用户体验比较差,上传的文件大小受到限制,所以如果我们需要上传上百或者更大的上G的文件时,HTML标准上传方式是无法满足我们的需求的。 而另一方面,随着互联网行业的发展用户产生的新的需求也越来越多,同时对用户体验也提出了更高的要求,传统的HTML方式也越来越难已满足新的用户需求。现在大部分的用户有文件批量上传的需求,希望只通过点击一次鼠标就能够批量的上传多张图片,而不是一张张的选择文件上传,这样操作即浪费时间又非常烦琐。 近年来,由于数码和影视行业的迅猛发展刺激了用户对大文件的上传需求,现在越来越多的用户希望能够通过WEB的方式上传更大的文件,比如电影和图片。这些类型的文件通常都非常大,一般都在500MB以上,高清的影视文件至少在1G以上。这样的大文件是根本无法通过标准HTML方式来上传的。 不仅如此,由于国内网络环境比较特殊,有许多地区的网络不够稳定,在上传文件的过程中可能会发生断网的情况。如果用户正在上传一个1000MB的文件,已经上传了500MB,这时网络出现问题上传中止了。那么下一次用户需要要重新上传前面的500MB,而不是从500MB开始上传,这将浪费用户的许多时间。 新颖网络HTTP文件断点续传控件是专门用于解决HTTP大文件上传的需求而开发的产品。通过我们的HttpPartition模块用户能够非常方便的一次性选择超过200个的文件。而且我们升级了用户体验,用户现在不仅能够通过点击按钮来选择多个文件,还可以通过HttpDroper来拖拽文件甚至是文件夹。 现在我们能够轻松支持2G左右的大文件上传。为了减轻服务器的压力在HttpUploader模块中我们并不是一次上传2G的数据,而是将2G化分为小的数据块,每次向服务器上传约128KB左右的数据。同时在每次上传的数据中附带了文件大小,起始位置,文件MD5等信息。对于开发人员来说,有了这些信息,断点续传功能将会变的和普通的文件上传功能一样简单。 相信新颖网络HTTP断点续传控件能够帮助您赢利市场。 版权所有 2009-2012 北京新颖网络 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/http-uploader3/index.aspx 在线演示:http://www.ncmem.com/products/http-uploader/demo/index.html 产品介绍:http://www.cnblogs.com/xproer/archive/2012/02/17/2355440.html 开发文档-ASP:http://www.cnblogs.com/xproer/archive/2012/02/17/2355458.html 开发文档-PHP:http://www.cnblogs.com/xproer/archive/2012/02/17/2355467.html 开发文档-JSP:http://www.cnblogs.com/xproer/archive/2012/02/17/2355462.html 开发文档-ASP.NET:http://www.cnblogs.com/xproer/archive/2012/02/17/2355469.html 升级日志:http://www.cnblogs.com/xproer/archive/2012/02/17/2355449.html 示例下载:http://www.ncmem.com/download/HttpUploader3-demo.rar 文档下载:http://www.ncmem.com/download/HttpUploader3-doc.rar 问题反馈:http://www.ncmem.com/blog/guestbook.asp Windows数字证书补丁:http://www.ncmem.com/download/rootsupd.rar Microsoft Visual C++ 2008 Redistributable Package (x86):http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=29
现在大部分的网站使用的是标准HTML的上传方式来上传文件。一般情况下标准HTML方式在网页中只能上传4MB左右的文件,如果访问的用户比较多的时侯这种方式容易上传失败。虽然标准HTML上传方式开发起来比较简单,但是这种方式用户体验比较差,上传的文件大小受到限制,所以如果我们需要上传上百或者更大的上G的文件时,HTML标准上传方式是无法满足我们的需求的。 而另一方面,随着互联网行业的发展用户产生的新的需求也越来越多,同时对用户体验也提出了更高的要求,传统的HTML方式也越来越难已满足新的用户需求。现在大部分的用户有文件批量上传的需求,希望只通过点击一次鼠标就能够批量的上传多张图片,而不是一张张的选择文件上传,这样操作即浪费时间又非常烦琐。 近年来,由于数码和影视行业的迅猛发展刺激了用户对大文件的上传需求,现在越来越多的用户希望能够通过WEB的方式上传更大的文件,比如电影和图片。这些类型的文件通常都非常大,一般都在500MB以上,高清的影视文件至少在1G以上。这样的大文件是根本无法通过标准HTML方式来上传的。 不仅如此,由于国内网络环境比较特殊,有许多地区的网络不够稳定,在上传文件的过程中可能会发生断网的情况。如果用户正在上传一个1000MB的文件,已经上传了500MB,这时网络出现问题上传中止了。那么下一次用户需要要重新上传前面的500MB,而不是从500MB开始上传,这将浪费用户的许多时间。 新颖网络HTTP文件断点续传控件是专门用于解决HTTP大文件上传的需求而开发的产品。通过我们的HttpPartition模块用户能够非常方便的一次性选择超过200个的文件。而且我们升级了用户体验,用户现在不仅能够通过点击按钮来选择多个文件,还可以通过HttpDroper来拖拽文件甚至是文件夹。 现在我们能够轻松支持2G左右的大文件上传。为了减轻服务器的压力在HttpUploader模块中我们并不是一次上传2G的数据,而是将2G化分为小的数据块,每次向服务器上传约128KB左右的数据。同时在每次上传的数据中附带了文件大小,起始位置,文件MD5等信息。对于开发人员来说,有了这些信息,断点续传功能将会变的和普通的文件上传功能一样简单。 相信新颖网络HTTP断点续传控件能够帮助您赢利市场。 产品介绍:[url=http://www.cnblogs.com/xproer/archive/2012/02/17/2355440.html][/url]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值