精华内容
下载资源
问答
  • java webapp 几种文件上传和下载方式下载方式:第一种:a>1测试pc端chorme,safari,ie11,edge,可用,,移动端,,ios可直接开打pdf,word等文件,android上只有qq浏览器可直接查看,其他均要下载.第二种:springmvc实现@...

    java webapp 几种文件上传和下载方式

    下载方式:

    第一种:

    a>

    1

    测试pc端chorme,safari,ie11,edge,可用,,移动端,,ios可直接开打pdf,word等文件,android上只有qq浏览器可直接查看,其他均要下载.

    第二种:

    springmvc实现

    @RequestMapping("/download")

    public String download(@RequestParam String fileName, HttpServletRequest request,

    HttpServletResponse response) {

    response.setCharacterEncoding("utf-8");

    response.setContentType("multipart/form-data");

    try {

    //Content-Disposition文件名中文编码问题

    String new_filename = URLEncoder.encode(fileName, "UTF8");

    // 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的

    String rtn = "filename=\"" + new_filename + "\"";

    String userAgent = request.getHeader("user-agent");

    if (userAgent != null)

    {

    userAgent = userAgent.toLowerCase();

    // IE浏览器,只能采用URLEncoder编码

    if (userAgent.indexOf("msie") != -1)

    {

    rtn = "filename=\"" + new_filename + "\"";

    }

    // Opera浏览器只能采用filename*

    else if (userAgent.indexOf("opera") != -1)

    {

    rtn = "filename*=UTF-8''" + new_filename;

    }

    // Safari浏览器,只能采用ISO编码的中文输出

    else if (userAgent.indexOf("safari") != -1 )

    {

    rtn = "filename=\"" + new String(fileName.getBytes("UTF-8"),"ISO8859-1") + "\"";

    }

    // Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出

    else if (userAgent.indexOf("applewebkit") != -1 )

    {

    new_filename = MimeUtility.encodeText(fileName, "UTF8", "B");

    rtn = "filename=\"" + new_filename + "\"";

    }

    // FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出

    else if (userAgent.indexOf("mozilla") != -1)

    {

    rtn = "filename*=UTF-8''" + new_filename;

    }

    }

    response.setHeader("Content-Disposition", "attachment;"+rtn);

    String path = request.getSession().getServletContext().getRealPath("/") + "upload/inform/" ;

    System.out.println(fileName);

    InputStream inputStream = new FileInputStream(new File(path

    + File.separator + fileName));

    OutputStream os = response.getOutputStream();

    byte[] b = new byte[2048];

    int length;

    while ((length = inputStream.read(b)) > 0) {

    os.write(b, 0, length);

    }

    // 这里主要关闭。

    os.close();

    inputStream.close();

    } catch (Exception e) {

    e.printStackTrace();

    }

    // 返回值要注意,要不然就出现下面这句错误!

    //java+getOutputStream() has already been called for this response

    return null;

    }

    html代码

    但是这种方法在ios浏览器不能直接打开pdf,word等文件,需要下载,andoird上,各浏览器也不行.

    3,第三种

    我觉得这种最好,需要浏览器支持

    上传方式

    springmvc MultipartFile方式.

    java代码

    @RequestMapping(value="/fileUpload",method= RequestMethod.POST)

    public String fileUpload(HttpServletRequest request,@RequestParam("file") MultipartFile file,@ModelAttribute Inform inform) throws IOException {

    try {

    int id = service.insertInform(inform);

    if (!file.isEmpty()) {

    // 文件保存路径

    String filePath = request.getSession().getServletContext().getRealPath("/") + "upload/inform/"

    +file.getOriginalFilename();

    // 转存文件

    file.transferTo(new File(filePath));

    }

    } catch (Exception e) {

    e.printStackTrace();

    return "uploadErro";

    }

    // 重定向

    return "uploadSuccess";

    }

    *这里的文件作为附件功能上传

    html代码*

    method="post" id="form_2" action="do" />" data-ajax="false" enctype="multipart/form-data">

    class="ui-field-contain">

    for="ititle">标题:

    type="text" name="title" id="ititle" value="" class="input">

    type="text" name="content" id="content" value="" class="input" style="display: none">

    type="text" name="author" id="author" value="${name}" style="display: none;">

    type="text" name="publiccompany" id="publiccompany" value="${company}" style="display: none;">

    type="datetime" name="datetime" id="datetime" value="" style="display: none;" class="input">

    type="text" name="checktype" id="checktype" value="未审核" style="display: none;">

    for="file">文件:

    type="file" name="file" id="file" value="">

    "text-align: center;width: 100%">

    type="button" value="提交" style="text-align: center" id="submit_button" οnclick="toSubmit()">

    可与model一起上传..

    这是目前最简单的方法了,还有其他方法我看都比较复杂,写下这个记录,

    展开全文
  • 前端下载几种方式

    2020-03-11 18:00:00
    对于前端的下载方式有多种,每一自己不同的优略势,下面就一个一个写出对应的优缺点 a便签 a标签是最常见,也最简单的处理方式 <a href="example.jpg" download>点击下载</a> 优点 能解决不能...

    对于前端的下载方式有多种,每一种都有自己不同的优略势,下面就一个一个写出对应的优缺点

    a便签

    a标签是最常见,也最简单的处理方式

    <a href="xxx.jpg" download>点击下载</a>
    
    优点

    能解决不能直接下载浏览器可浏览的文件

    缺点

    必须知道下载文件地址
    不能跨域下载
    有兼容性问题,特别是IE
    不能进行鉴权

    Blod对象

    blod是我第二个经常用的下载方式,将请求的二进制数据转化为blod对象,利用URL.createObjectUrl生成地址,再赋值给a标签

    const xhr=new XMLHttpRequest();
    xhr.open('get',xxxxx)//xxx为下载地址
    xhr.responseType='blob';
    xhr.send();
    xhr.onreadystatechange=function(){
    	if(this.readyState===4&&this.status===200){
    		const url=URl.createObjectURL(xhr.response);
    		const a=document.createElement('a');
    		a.style.display='none';
    		a.href=url;
    		a.download='下载名称'
    		document.body.appendChild(a);
    		a.click();
    		document.body.removeChild(a);
    	}
    }
    
    优点

    解决跨域问题
    可以设置header

    缺点

    兼容不太友好(IE,safari)

    from表单提交

    from是以前经常使用的传统方式,兼容性也好

    const from=document.createElemt('form');
    from.action='xxx'//链接地址
    from.method='get'//请求方式
    from.style.display='none';
    const input=document.createElement('input');
    input.name='参数字段名'
    input.value='参数值'
    from.appendChild(input);
    document.body.appendChild(from);
    from.submit();//开始请求
    document.body.removeChild(from);//请求完毕后清除from
    
    优点

    传统方式,兼容性好

    缺点

    不知道下载进度
    不知道下载的什么东西

    展开全文
  • jquery有几风格和过渡方式的焦点图代码下载
  • c#下载文件的几种方式

    千次阅读 2016-05-29 21:48:28
    C#实现文件下载几种方式 先把问题的代码贴出来吧, using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using ...

    C#实现文件下载的几种方式

    先把有问题的代码贴出来吧,

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.IO;

    namespace infoPlatClient.NetDisk
    {
        public partial class downLoad : Com.DRPENG.Common.WebStruct.BaseForm
        {

            /// <summary>
            /// 取得要下载文件的路径
            /// </summary>
            private string fileRpath
            {
                get
                {
                    return Request["fileRpath"] == null ? "" : Request["fileRpath"];
                }
            }
            /// <summary>
            /// 取得要下载文件的名称
            /// </summary>
          
            protected void Page_Load(object sender, EventArgs e)
            {
                    if (!IsPostBack)
                    this.DownloadFile();
            }
            public void DownloadFile()
            {

                    Response.ClearHeaders();
                    Response.Clear();
                    Response.Expires = 0;
                    Response.Buffer =true;
                    Response.AddHeader("Accept-Language", "zh-tw");
                    string name = System.IO.Path.GetFileName(fileRpath);
                    System.IO.FileStream files = new FileStream(fileRpath, FileMode.Open, FileAccess.Read, FileShare.Read);
                    byte[] byteFile=null;
                    if (files.Length == 0)
                    {
                        byteFile=new byte[1];
                    }
                    else
                    {
                        byteFile = new byte[files.Length];
                    }
                    files.Read(byteFile, 0, (int)byteFile.Length);
                    files.Close();
                
                    Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(name, System.Text.Encoding.UTF8));
                    Response.ContentType = "application/octet-stream;charset=gbk";
                    Response.BinaryWrite(byteFile);
                    Response.End();
                 
            }
        }
    }

     之前一直用这种下载方式,可是有一次用户上传了一个700Mb的文件时报内存溢出的问题,分析了一下原因,用户的内存只有256M,而下载文件时要创建内存流,导致了内存溢出。

    解决方案:1>WriteFile分块下载,就是每次下载指定数量的多件;

                 2>通过超链接的方式;

                 lblDownLoad.Text = "<a href='" + drv["VPath"].ToString() + "'>下载</a>"

    下面是四种实现文件下载的方式:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.IO;

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        //TransmitFile实现下载
        protected void Button1_Click(object sender, EventArgs e)
        {
            /*
             微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
             下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
             代码如下:
             */

            Response.ContentType = "application/x-zip-compressed";
            Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
            string filename = Server.MapPath("DownLoad/z.zip");
            Response.TransmitFile(filename);
        }

        //WriteFile实现下载
        protected void Button2_Click(object sender, EventArgs e)
        {
            /*
             using System.IO;
            
             */

            string fileName ="asd.txt";//客户端保存的文件名
            string filePath=Server.MapPath("DownLoad/aaa.txt");//路径

            FileInfo fileInfo = new FileInfo(filePath);
            Response.Clear();
            Response.ClearContent();
            Response.ClearHeaders();
            Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
            Response.AddHeader("Content-Length", fileInfo.Length.ToString());
            Response.AddHeader("Content-Transfer-Encoding", "binary");
            Response.ContentType = "application/octet-stream";
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            Response.WriteFile(fileInfo.FullName);
            Response.Flush();
            Response.End();
        }

        //WriteFile分块下载
        protected void Button3_Click(object sender, EventArgs e)
        {

            string fileName = "aaa.txt";//客户端保存的文件名
            string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);

            if (fileInfo.Exists == true)
            {
                const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
                byte[] buffer = new byte[ChunkSize];

                Response.Clear();
                System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
                long dataLengthToRead = iStream.Length;//获取下载的文件总大小
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
                while (dataLengthToRead > 0 && Response.IsClientConnected)
                {
                    int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
                    Response.OutputStream.Write(buffer, 0, lengthRead);
                    Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                Response.Close();
            }
        }

        //流方式下载
        protected void Button4_Click(object sender, EventArgs e)
        {
            string fileName = "aaa.txt";//客户端保存的文件名
            string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

            //以字符流的形式下载文件
            FileStream fs = new FileStream(filePath, FileMode.Open);
            byte[] bytes = new byte[(int)fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            fs.Close();
            Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
            Response.BinaryWrite(bytes);
            Response.Flush();
            Response.End();

        }
    }

     


    展开全文
  • C#实现文件下载几种方式 先把问题的代码贴出来吧, using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using...

    C#实现文件下载的几种方式

    先把有问题的代码贴出来吧,

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.IO;

    namespace infoPlatClient.NetDisk
    {
        public partial class downLoad : Com.DRPENG.Common.WebStruct.BaseForm
        {

            /// <summary>
            /// 取得要下载文件的路径
            /// </summary>
            private string fileRpath
            {
                get
                {
                    return Request["fileRpath"] == null ? "" : Request["fileRpath"];
                }
            }
            /// <summary>
            /// 取得要下载文件的名称
            /// </summary>
           
            protected void Page_Load(object sender, EventArgs e)
            {
                    if (!IsPostBack)
                    this.DownloadFile();
            }
            public void DownloadFile()
            {

                    Response.ClearHeaders();
                    Response.Clear();
                    Response.Expires = 0;
                    Response.Buffer =true;
                    Response.AddHeader("Accept-Language", "zh-tw");
                    string name = System.IO.Path.GetFileName(fileRpath);
                    System.IO.FileStream files = new FileStream(fileRpath, FileMode.Open, FileAccess.Read, FileShare.Read);
                    byte[] byteFile=null;
                    if (files.Length == 0)
                    {
                        byteFile=new byte[1];
                    }
                    else
                    {
                        byteFile = new byte[files.Length];
                    }
                    files.Read(byteFile, 0, (int)byteFile.Length);
                    files.Close();
                 
                    Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(name, System.Text.Encoding.UTF8));
                    Response.ContentType = "application/octet-stream;charset=gbk";
                    Response.BinaryWrite(byteFile);
                    Response.End();
                  
            }
        }
    }

     之前一直用这种下载方式,可是有一次用户上传了一个700Mb的文件时报内存溢出的问题,分析了一下原因,用户的内存只有256M,而下载文件时要创建内存流,导致了内存溢出。

    解决方案:1>WriteFile分块下载,就是每次下载指定数量的多件;

                 2>通过超链接的方式;

                 lblDownLoad.Text = "<a href='" + drv["VPath"].ToString() + "'>下载</a>"

    下面是四种实现文件下载的方式:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.IO;

    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        //TransmitFile实现下载
        protected void Button1_Click(object sender, EventArgs e)
        {
            /*
             微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
             下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
             代码如下:
             */

            Response.ContentType = "application/x-zip-compressed";
            Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
            string filename = Server.MapPath("DownLoad/z.zip");
            Response.TransmitFile(filename);
        }

        //WriteFile实现下载
        protected void Button2_Click(object sender, EventArgs e)
        {
            /*
             using System.IO;
             
             */

            string fileName ="asd.txt";//客户端保存的文件名
            string filePath=Server.MapPath("DownLoad/aaa.txt");//路径

            FileInfo fileInfo = new FileInfo(filePath);
            Response.Clear();
            Response.ClearContent();
            Response.ClearHeaders();
            Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
            Response.AddHeader("Content-Length", fileInfo.Length.ToString());
            Response.AddHeader("Content-Transfer-Encoding", "binary");
            Response.ContentType = "application/octet-stream";
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            Response.WriteFile(fileInfo.FullName);
            Response.Flush();
            Response.End();
        }

        //WriteFile分块下载
        protected void Button3_Click(object sender, EventArgs e)
        {

            string fileName = "aaa.txt";//客户端保存的文件名
            string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);

            if (fileInfo.Exists == true)
            {
                const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
                byte[] buffer = new byte[ChunkSize];

                Response.Clear();
                System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
                long dataLengthToRead = iStream.Length;//获取下载的文件总大小
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
                while (dataLengthToRead > 0 && Response.IsClientConnected)
                {
                    int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
                    Response.OutputStream.Write(buffer, 0, lengthRead);
                    Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                Response.Close();
            }
        }

        //流方式下载
        protected void Button4_Click(object sender, EventArgs e)
        {
            string fileName = "aaa.txt";//客户端保存的文件名
            string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

            //以字符流的形式下载文件
            FileStream fs = new FileStream(filePath, FileMode.Open);
            byte[] bytes = new byte[(int)fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            fs.Close();
            Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
            Response.BinaryWrite(bytes);
            Response.Flush();
            Response.End();

        }
    }

     



     

    该文章经过本人整理所得,欢迎转载,转载时请加上本文地址;本文基于署名 2.5 中国大陆许可协议发布,请勿演绎或用于商业目的,但是必须保留本文的署名张志涛(包含链接如您有任何疑问或者授权方面的协商,请给我留言
    展开全文
  • 只转了前面几种比较常用的方法,想看全部的请前往原网址查看 在实现点击下载文件多种方法: 后端设置header信息 通过后端告诉浏览器header信息实现下载: header('Content-type: image/jpeg'); header(...
  • Java文件下载几种方式 ----------------大文件可能问题 public HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径...
  • Webview 实现下载方式主要: 跳转到浏览器下载 使用系统的下载服务 自定义下载 本人能想到的只有三,如遗漏,还请赐教~~ 记得添加 网络权限&文件读取权限,此处忽略不计,不懂请自行百度 2. ...
  • (二)onload事件的几种方式(普通方式,jQuery方式) 新建web项目,导入jQuery进js文件夹 比如现在我们要实现如下功能:弹出“helloworld”对话框,普通的方式以下几种 第一种方式: <!DOCT...
  • 实现HTTP下载几种方式

    千次阅读 2005-06-20 16:51:00
    我们在Internet上浏览网页时,经常会下载需要的文件,有些是FTP方式下载,多数则是基于HTTP协议的文件下载,实质...HTTP下载从技术上来说实现方式,1. 直接链接到需要下载的文件蔡依林 - 城堡这种方式使用简单
  • 本篇文章主要介绍以下几种数据下载方式,如果介绍不清楚或漏掉的欢迎大家留言评论指出。 1. OSM官网下载 打开OSM官网,可以通过【导出】功能进行任意区域的数据下载,但是这种下载方式还是比较粗糙的,它不能按照...
  • 流程资源可以是各种类型的文件,在启动流程或流程实例运行过程中会被...如果无法获取可以给我留言,我会第一时间给你发gitee下载链接。一、流程资源 流程定义文件:扩展名为bpmn20.xml和bpmn; 流程定义的图片:用BPM...
  • 第七章 ESP32程序下载几种方式

    千次阅读 2018-12-29 09:59:58
    ESP32开发指南QQ群:824870185,内pdf版,排版整洁。 方法一:官方工具 工具可从官方网站下载,此方法适合量产。 烧录文件目录,在工程文件夹下: build\bootloader\bootloader.bin 0x01000 build\partitions...
  • stm32的几种下载程序的方式

    千次阅读 2020-02-05 18:54:09
    stm32的下载方式我目前接触最多的,用串口ISP烧录hex文件,用仿真器一键烧录,还有那种小白式的bootlaoder固件升级烧录 用转串口模块烧录hex文件 首先要下载一个软件,然后怎么下载嘞我不想说,因为这种方式用...
  • 限时干货下载:回复【7】免费获取【完整数据分析资料!(包括SPSS、SAS、SQL、EXCEL、Project)!...所以今天分享一下MySQL数据库的备份的几种方式。1.使用命令行的方式命令行的方式较为快捷,只需要在命令行...
  • ... 阅:经验证,//使用WriteFile下载文件 这个方法,是可以用的;...asp.net2.0以后,我们了很多文件下载的选择。 public partial class FileDownLoad : System.Web.UI.Page { ...
  • 总第132篇/张俊红我们知道Python之所以很流行,一个很重要的原因是因为它很多包可以供我们使用,但是这些包很多都不是自带的,需要手动去安装,本篇我们就讲一下安装Python包的几种方式。1.前言我们平常用到的包...
  • Android 使用Glide下载图片的几种方式

    万次阅读 2018-04-19 18:03:02
    首先介绍篇不错的文章,很多简介就不说了,可以去看一下这篇文正,写的很详细,我也是在做项目的过程中的学习这篇文章,不过运用的场景可能不太相同,所以我把我的场景写了下来。 Glide是Google官方推荐的...
  • 方法一 ...个弊端 浏览器 的安全策略 可能会被blocked。 window.open('url','_blank'); 方法三 针对后端返回的是文件流 ,下载到前端 需要保存到本地的 代码中的object 用于创建 URL 的..
  • (给DotNet加星标,提升.Net技能)转自:学习中的苦与乐cnblogs.com/xiongze520/p/10417472.html上一篇《.NET基于WebUploader大文件分片上传、断网续传、秒传》我们说到大文件的分片下载、...,的博友就想看分片下载...
  • 今天一个导出相应数据为excel表的需求。后端的接口返回一个数据流,...下面列觉两我测试成功的方式: 1.window.location.href = ‘接口地址’  含义:当前页面打开URL页面.  和在浏览器输入接口地址一样,可以...
  • (总结一下这些方式,在包下载不顺利时,多换几种方式) 1.在cmd窗口下使用命令直接下载 切换路径到pip所在位置,然后输入指令下载。 (关于程序下载慢的问题,可以切换下载路径到国内镜像资源网站,或者直接用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,227
精华内容 890
关键字:

下载有几种方式