zoukankan      html  css  js  c++  java
  • springMVC上传与下载

    springMVC上传与下载

    首先,springmvc.xml必须配置:

    Java代码

    1.      <bean id="multipartResolver"  

    2.              class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8"/>         

    <bean id="multipartResolver"

    class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8"/>


    2 WEB-INF/lib下必加入:commons-fileupload.jar与commons-io-1.4.jar二个文件 
    3 表单属性为: enctype="multipart/form-data" 
    工程项目图片如下: 

    具体代码如下: 
    FileUploadBean.java

    Java代码

    1.      public class FileUploadBean {      

    2.          private byte[] file;   

    3.        

    4.          public void setFile(byte[] file) {   

    5.              this.file = file;   

    6.          }   

    7.        

    8.          public byte[] getFile() {   

    9.              return file;   

    10.       }   

    11.   }  

    public class FileUploadBean {

    private byte[] file;

    public void setFile(byte[] file) {

    this.file = file;

    }

    public byte[] getFile() {

    return file;

    }

    }

    Java代码

    1.      package net.liuzd.web;   

    2.        

    3.      import java.io.BufferedInputStream;   

    4.      import java.io.BufferedOutputStream;   

    5.      import java.io.File;   

    6.      import java.io.FileInputStream;   

    7.      import java.io.IOException;   

    8.      import java.net.BindException;   

    9.      import java.util.ArrayList;   

    10.     

    11.   import java.util.List;   

    12.   import java.util.Map;   

    13.     

    14.   import javax.servlet.http.HttpServletRequest;   

    15.   import javax.servlet.http.HttpServletResponse;   

    16.     

    17.   import org.springframework.stereotype.Controller;   

    18.   import org.springframework.util.FileCopyUtils;   

    19.   import org.springframework.web.bind.annotation.PathVariable;   

    20.   import org.springframework.web.bind.annotation.RequestMapping;   

    21.   import org.springframework.web.bind.annotation.RequestMethod;   

    22.   import org.springframework.web.bind.annotation.RequestParam;   

    23.   import org.springframework.web.multipart.MultipartFile;   

    24.   import org.springframework.web.multipart.MultipartHttpServletRequest;   

    25.   import org.springframework.web.multipart.commons.CommonsMultipartFile;   

    26.   import org.springframework.web.servlet.ModelAndView;   

    27.     

    28.   /**  

    29.    * Title: Description: Copyright: Copyright (c) 2011  

    30.    * Company:http://liuzidong.iteye.com/ ;Makedate:2011-5-27 下午01:52:17  

    31.    *   

    32.    * @author liuzidong  

    33.    * @version 1.0  

    34.    * @since 1.0  

    35.    *   

    36.    */  

    37.   @Controller  

    38.   public class FileUploadController {   

    39.     

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

    41.       public ModelAndView onSubmit(HttpServletRequest request,   

    42.               HttpServletResponse response, BindException errors)   

    43.               throws Exception {   

    44.     

    45.           MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   

    46.           CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest   

    47.                   .getFile("file");   

    48.     

    49.           String name = multipartRequest.getParameter("name");   

    50.           System.out.println("name: " + name);   

    51.           // 获得文件名:   

    52.           String realFileName = file.getOriginalFilename();   

    53.           System.out.println("获得文件名:" + realFileName);   

    54.           // 获取路径   

    55.           String ctxPath = request.getSession().getServletContext().getRealPath(   

    56.                   "/")   

    57.                   + "images/";   

    58.           // 创建文件   

    59.           File dirPath = new File(ctxPath);   

    60.           if (!dirPath.exists()) {   

    61.               dirPath.mkdir();   

    62.           }   

    63.           File uploadFile = new File(ctxPath + realFileName);   

    64.           FileCopyUtils.copy(file.getBytes(), uploadFile);   

    65.           request.setAttribute("files", loadFiles(request));   

    66.           return new ModelAndView("success");   

    67.       }   

    68.     

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

    70.       public ModelAndView onSubmit2(HttpServletRequest request,   

    71.               HttpServletResponse response, BindException errors)   

    72.               throws Exception {   

    73.     

    74.           // 转型为MultipartHttpRequest   

    75.           MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   

    76.           // 根据前台的name名称得到上传的文件   

    77.           MultipartFile file = multipartRequest.getFile("file");   

    78.           // 获得文件名:   

    79.           String realFileName = file.getOriginalFilename();   

    80.           // 获取路径   

    81.           String ctxPath = request.getSession().getServletContext().getRealPath(   

    82.                   "/")   

    83.                   + "\" + "images\";   

    84.           // 创建文件   

    85.           File dirPath = new File(ctxPath);   

    86.           if (!dirPath.exists()) {   

    87.               dirPath.mkdir();   

    88.           }   

    89.           File uploadFile = new File(ctxPath + realFileName);   

    90.           FileCopyUtils.copy(file.getBytes(), uploadFile);   

    91.           request.setAttribute("files", loadFiles(request));   

    92.           return new ModelAndView("success");   

    93.       }   

    94.     

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

    96.       public String upload(@RequestParam("file")   

    97.       MultipartFile image, HttpServletRequest request) throws IOException {   

    98.     

    99.           String ctxPath = request.getSession().getServletContext().getRealPath(   

    100.                "/")   

    101.                + "\" + "images\";   

    102.        System.out.println("路径:" + ctxPath);   

    103.        File file = new File(ctxPath + "/" + image.getOriginalFilename());   

    104.        // FileCopyUtils.copy(image.getBytes(),new   

    105.        // File(ctxPath+"/"+image.getOriginalFilename()));   

    106.        try {   

    107.            image.transferTo(file); // 保存上传的文件   

    108.        } catch (IllegalStateException e) {   

    109.            e.printStackTrace();   

    110.        } catch (IOException e) {   

    111.            e.printStackTrace();   

    112.        }   

    113.        request.setAttribute("files", loadFiles(request));   

    114.        return "success";   

    115.    }   

    116.  

    117.    // 多文件上传   

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

    119.    public ModelAndView fileUpload(HttpServletRequest request,   

    120.            HttpServletResponse response, BindException errors)   

    121.            throws Exception {   

    122.  

    123.        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   

    124.        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();   

    125.        String ctxPath = request.getSession().getServletContext().getRealPath(   

    126.                "/")   

    127.                + "\" + "images\";   

    128.  

    129.        File file = new File(ctxPath);   

    130.        if (!file.exists()) {   

    131.            file.mkdir();   

    132.        }   

    133.        String fileName = null;   

    134.        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {   

    135.            // 上传文件名   

    136.            // System.out.println("key: " + entity.getKey());   

    137.            MultipartFile mf = entity.getValue();   

    138.            fileName = mf.getOriginalFilename();   

    139.            File uploadFile = new File(ctxPath + fileName);   

    140.            FileCopyUtils.copy(mf.getBytes(), uploadFile);   

    141.        }   

    142.        request.setAttribute("files", loadFiles(request));   

    143.        return new ModelAndView("success");   

    144.    }   

    145.  

    146.    // @ModelAttribute("files")//此属性用于初始类时调用,但上传文件后不能时时反应上传文件个数,不适合动态数据   

    147.    public List<String> loadFiles(HttpServletRequest request) {   

    148.        List<String> files = new ArrayList<String>();   

    149.        String ctxPath = request.getSession().getServletContext().getRealPath(   

    150.                "/")   

    151.                + "\" + "images\";   

    152.        File file = new File(ctxPath);   

    153.        if (file.exists()) {   

    154.            File[] fs = file.listFiles();   

    155.            String fname = null;   

    156.            for (File f : fs) {   

    157.                fname = f.getName();   

    158.                if (f.isFile()) {   

    159.                    files.add(fname);   

    160.                }   

    161.            }   

    162.        }   

    163.        return files;   

    164.    }   

    165.  

    166.    @RequestMapping("/download/{fileName}")   

    167.    public ModelAndView download(@PathVariable("fileName")   

    168.    String fileName, HttpServletRequest request, HttpServletResponse response)   

    169.            throws Exception {   

    170.  

    171.        response.setContentType("text/html;charset=utf-8");   

    172.        request.setCharacterEncoding("UTF-8");   

    173.        java.io.BufferedInputStream bis = null;   

    174.        java.io.BufferedOutputStream bos = null;   

    175.  

    176.        String ctxPath = request.getSession().getServletContext().getRealPath(   

    177.                "/")   

    178.                + "\" + "images\";   

    179.        String downLoadPath = ctxPath + fileName;   

    180.        System.out.println(downLoadPath);   

    181.        try {   

    182.            long fileLength = new File(downLoadPath).length();   

    183.            response.setContentType("application/x-msdownload;");   

    184.            response.setHeader("Content-disposition", "attachment; filename="  

    185.                    + new String(fileName.getBytes("utf-8"), "ISO8859-1"));   

    186.            response.setHeader("Content-Length", String.valueOf(fileLength));   

    187.            bis = new BufferedInputStream(new FileInputStream(downLoadPath));   

    188.            bos = new BufferedOutputStream(response.getOutputStream());   

    189.            byte[] buff = new byte[2048];   

    190.            int bytesRead;   

    191.            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {   

    192.                bos.write(buff, 0, bytesRead);   

    193.            }   

    194.        } catch (Exception e) {   

    195.            e.printStackTrace();   

    196.        } finally {   

    197.            if (bis != null)   

    198.                bis.close();   

    199.            if (bos != null)   

    200.                bos.close();   

    201.        }   

    202.        return null;   

    203.    }   

    204.}  

    package net.liuzd.web;

    import java.io.BufferedInputStream;

    import java.io.BufferedOutputStream;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.IOException;

    import java.net.BindException;

    import java.util.ArrayList;

    import java.util.List;

    import java.util.Map;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import org.springframework.stereotype.Controller;

    import org.springframework.util.FileCopyUtils;

    import org.springframework.web.bind.annotation.PathVariable;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RequestMethod;

    import org.springframework.web.bind.annotation.RequestParam;

    import org.springframework.web.multipart.MultipartFile;

    import org.springframework.web.multipart.MultipartHttpServletRequest;

    import org.springframework.web.multipart.commons.CommonsMultipartFile;

    import org.springframework.web.servlet.ModelAndView;

    /**

     * Title: Description: Copyright: Copyright (c) 2011

     * Company:http://liuzidong.iteye.com/ Makedate:2011-5-27 下午01:52:17

     *

     * @author liuzidong

     * @version 1.0

     * @since 1.0

     *

     */

    @Controller

    public class FileUploadController {

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

    public ModelAndView onSubmit(HttpServletRequest request,

    HttpServletResponse response, BindException errors)

    throws Exception {

    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

    CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest

    .getFile("file");

    String name = multipartRequest.getParameter("name");

    System.out.println("name: " + name);

    // 获得文件名:

    String realFileName = file.getOriginalFilename();

    System.out.println("获得文件名:" + realFileName);

    // 获取路径

    String ctxPath = request.getSession().getServletContext().getRealPath(

    "/")

    + "images/";

    // 创建文件

    File dirPath = new File(ctxPath);

    if (!dirPath.exists()) {

    dirPath.mkdir();

    }

    File uploadFile = new File(ctxPath + realFileName);

    FileCopyUtils.copy(file.getBytes(), uploadFile);

    request.setAttribute("files", loadFiles(request));

    return new ModelAndView("success");

    }

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

    public ModelAndView onSubmit2(HttpServletRequest request,

    HttpServletResponse response, BindException errors)

    throws Exception {

    // 转型为MultipartHttpRequest

    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

    // 根据前台的name名称得到上传的文件

    MultipartFile file = multipartRequest.getFile("file");

    // 获得文件名:

    String realFileName = file.getOriginalFilename();

    // 获取路径

    String ctxPath = request.getSession().getServletContext().getRealPath(

    "/")

    + "\" + "images\";

    // 创建文件

    File dirPath = new File(ctxPath);

    if (!dirPath.exists()) {

    dirPath.mkdir();

    }

    File uploadFile = new File(ctxPath + realFileName);

    FileCopyUtils.copy(file.getBytes(), uploadFile);

    request.setAttribute("files", loadFiles(request));

    return new ModelAndView("success");

    }

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

    public String upload(@RequestParam("file")

    MultipartFile image, HttpServletRequest request) throws IOException {

    String ctxPath = request.getSession().getServletContext().getRealPath(

    "/")

    + "\" + "images\";

    System.out.println("路径:" + ctxPath);

    File file = new File(ctxPath + "/" + image.getOriginalFilename());

    // FileCopyUtils.copy(image.getBytes(),new

    // File(ctxPath+"/"+image.getOriginalFilename()));

    try {

    image.transferTo(file); // 保存上传的文件

    } catch (IllegalStateException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    request.setAttribute("files", loadFiles(request));

    return "success";

    }

    // 多文件上传

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

    public ModelAndView fileUpload(HttpServletRequest request,

    HttpServletResponse response, BindException errors)

    throws Exception {

    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

    Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();

    String ctxPath = request.getSession().getServletContext().getRealPath(

    "/")

    + "\" + "images\";

    File file = new File(ctxPath);

    if (!file.exists()) {

    file.mkdir();

    }

    String fileName = null;

    for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {

    // 上传文件名

    // System.out.println("key: " + entity.getKey());

    MultipartFile mf = entity.getValue();

    fileName = mf.getOriginalFilename();

    File uploadFile = new File(ctxPath + fileName);

    FileCopyUtils.copy(mf.getBytes(), uploadFile);

    }

    request.setAttribute("files", loadFiles(request));

    return new ModelAndView("success");

    }

    // @ModelAttribute("files")//此属性用于初始类时调用,但上传文件后不能时时反应上传文件个数,不适合动态数据

    public List<String> loadFiles(HttpServletRequest request) {

    List<String> files = new ArrayList<String>();

    String ctxPath = request.getSession().getServletContext().getRealPath(

    "/")

    + "\" + "images\";

    File file = new File(ctxPath);

    if (file.exists()) {

    File[] fs = file.listFiles();

    String fname = null;

    for (File f : fs) {

    fname = f.getName();

    if (f.isFile()) {

    files.add(fname);

    }

    }

    }

    return files;

    }

    @RequestMapping("/download/{fileName}")

    public ModelAndView download(@PathVariable("fileName")

    String fileName, HttpServletRequest request, HttpServletResponse response)

    throws Exception {

    response.setContentType("text/html;charset=utf-8");

    request.setCharacterEncoding("UTF-8");

    java.io.BufferedInputStream bis = null;

    java.io.BufferedOutputStream bos = null;

    String ctxPath = request.getSession().getServletContext().getRealPath(

    "/")

    + "\" + "images\";

    String downLoadPath = ctxPath + fileName;

    System.out.println(downLoadPath);

    try {

    long fileLength = new File(downLoadPath).length();

    response.setContentType("application/x-msdownload;");

    response.setHeader("Content-disposition", "attachment; filename="

    + new String(fileName.getBytes("utf-8"), "ISO8859-1"));

    response.setHeader("Content-Length", String.valueOf(fileLength));

    bis = new BufferedInputStream(new FileInputStream(downLoadPath));

    bos = new BufferedOutputStream(response.getOutputStream());

    byte[] buff = new byte[2048];

    int bytesRead;

    while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {

    bos.write(buff, 0, bytesRead);

    }

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    if (bis != null)

    bis.close();

    if (bos != null)

    bos.close();

    }

    return null;

    }

    }


    spring.xml

    Java代码  

    1.      <?xml version="1.0" encoding="UTF-8" ?>   

    2.      <beans xmlns="http://www.springframework.org/schema/beans"  

    3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    4.          xmlns:p="http://www.springframework.org/schema/p"  

    5.          xmlns:context="http://www.springframework.org/schema/context"      

    6.          xsi:schemaLocation="   

    7.              http://www.springframework.org/schema/beans    

    8.              http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   

    9.              http://www.springframework.org/schema/context    

    10.           http://www.springframework.org/schema/context/spring-context-3.0.xsd">   

    11.       <!--    

    12.           自动搜索@Controller标注的类   

    13.           用于指明系统从哪个路径下寻找controller,然后提前初始化这些对象。   

    14.       -->   

    15.       <context:component-scan base-package="net.liuzd.web" />   

    16.     

    17.       <!--  ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->   

    18.       <bean   

    19.           class="org.springframework.web.servlet.view.InternalResourceViewResolver"  

    20.           p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />   

    21.     

    22.         

    23.       <bean id="multipartResolver"  

    24.           class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8">   

    25.           <property name="maxUploadSize">   

    26.               <value>104857600</value>   

    27.           </property>   

    28.           <property name="maxInMemorySize">   

    29.               <value>4096</value>   

    30.           </property>   

    31.       </bean>   

    32.   </beans>  

    <?xml version="1.0" encoding="UTF-8" ?>

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:p="http://www.springframework.org/schema/p"

    xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="

            http://www.springframework.org/schema/beans

            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

            http://www.springframework.org/schema/context

            http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--

    自动搜索@Controller标注的类

    用于指明系统从哪个路径下寻找controller,然后提前初始化这些对象。

    -->

    <context:component-scan base-package="net.liuzd.web" />

    <!--  ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->

    <bean

    class="org.springframework.web.servlet.view.InternalResourceViewResolver"

    p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

      

    <bean id="multipartResolver"

    class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8">

    <property name="maxUploadSize">

    <value>104857600</value>

    </property>

    <property name="maxInMemorySize">

    <value>4096</value>

    </property>

    </bean>

    </beans>


    success.jsp

    Java代码  

    1.      <%@ taglib  prefix="c" uri="/WEB-INF/c.tld"%>   

    2.      <h1>Upload Successful</h1>   

    3.          <c:forEach var="month" items="${files}">   

    4.              <li><a href="${pageContext.request.contextPath}/download/${month}.do">${month}</a></li>   

    5.          </c:forEach>   

    6.        <hr><br>   

    7.        <a href="${pageContext.request.contextPath}/index.jsp">返回</a>  

    <%@ taglib  prefix="c" uri="/WEB-INF/c.tld"%>

    <h1>Upload Successful</h1>

    <c:forEach var="month" items="${files}">

        <li><a href="${pageContext.request.contextPath}/download/${month}.do">${month}</a></li>

    </c:forEach>

      <hr><br>

      <a href="${pageContext.request.contextPath}/index.jsp">返回</a>


    web.xml

    Java代码  

    1.      <?xml version="1.0" encoding="UTF-8"?>   

    2.      <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  

    3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    4.          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    

    5.          http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">   

    6.             

    7.          <context-param>   

    8.              <param-name>log4jConfigLocation</param-name>   

    9.              <param-value>/WEB-INF/classes/log4j.properties</param-value>   

    10.       </context-param>   

    11.     

    12.       <context-param>   

    13.           <param-name>log4jRefreshInterval</param-name>   

    14.           <param-value>60000</param-value>   

    15.       </context-param>   

    16.       <context-param>   

    17.           <param-name>log4jExposeWebAppRoot</param-name>   

    18.           <param-value>false</param-value>   

    19.       </context-param>   

    20.     

    21.       <listener>   

    22.           <listener-class>   

    23.               org.springframework.web.util.Log4jConfigListener   

    24.           </listener-class>   

    25.       </listener>   

    26.     

    27.       <filter>   

    28.           <filter-name>encodingFilter</filter-name>   

    29.           <filter-class>   

    30.               org.springframework.web.filter.CharacterEncodingFilter   

    31.           </filter-class>   

    32.           <init-param>   

    33.               <param-name>encoding</param-name>   

    34.               <param-value>UTF-8</param-value>   

    35.           </init-param>   

    36.           <init-param>   

    37.               <param-name>forceEncoding</param-name>   

    38.               <param-value>false</param-value>   

    39.           </init-param>   

    40.       </filter>   

    41.     

    42.       <filter-mapping>   

    43.           <filter-name>encodingFilter</filter-name>   

    44.           <url-pattern>*.do</url-pattern>   

    45.       </filter-mapping>   

    46.     

    47.       <filter-mapping>   

    48.           <filter-name>encodingFilter</filter-name>   

    49.           <url-pattern>*.jsp</url-pattern>   

    50.       </filter-mapping>   

    51.     

    52.       <servlet>   

    53.           <servlet-name>springmvc</servlet-name>   

    54.           <servlet-class>   

    55.               org.springframework.web.servlet.DispatcherServlet   

    56.           </servlet-class>   

    57.           <init-param>   

    58.               <param-name>contextConfigLocation</param-name>   

    59.               <param-value>classpath:springmvc.xml</param-value>   

    60.           </init-param>   

    61.           <load-on-startup>1</load-on-startup>   

    62.       </servlet>   

    63.     

    64.       <servlet-mapping>   

    65.           <servlet-name>springmvc</servlet-name>   

    66.           <url-pattern>*.do</url-pattern>   

    67.       </servlet-mapping>   

    68.       <welcome-file-list>   

    69.           <welcome-file>index.jsp</welcome-file>   

    70.       </welcome-file-list>   

    71.   </web-app>  

    那一汪清眸,那一瞥青涩的目光,那一段青春岁月。我一直在寻找,寻找一个属于我的婆娑世界,寻找那一年的自己,再也回不去了……
  • 相关阅读:
    冒泡排序
    二分查找
    数3退1的java实现
    列出目录下对应的子目录及文件
    errno相关
    Fibonacci
    windows 下查看Python 的安装路径
    20条编程经验
    [转]一位程序员工作10年总结的13个忠告
    Sql查询语句过滤重复的数据
  • 原文地址:https://www.cnblogs.com/feiger/p/3936865.html
Copyright © 2011-2022 走看看