一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringMVC實現(xiàn)文件的上傳和下載實例代碼

SpringMVC實現(xiàn)文件的上傳和下載實例代碼

2020-09-25 10:58錢春華 Java教程

本篇文章主要介紹了SpringMVC實現(xiàn)文件的上傳和下載實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前些天一位江蘇經(jīng)貿的學弟跟我留言問了我這樣一個問題:“用什么技術來實現(xiàn)一般網(wǎng)頁上文件的上傳和下載?是框架還是java中的io流”。我回復他說:“使用springmvc框架可以做到這一點,因為springmvc為文件的上傳提供了直接的支持,但需要依賴apache提供commons fileupload組件jar包。”鑒于這個問題,我上網(wǎng)也百度了一下,網(wǎng)上很多都是介紹的使用io流來實現(xiàn)文件的上傳和下載,也有說到框架的,但介紹的并不是很完整,今天小錢將和大家介紹使用springmvc框架來實現(xiàn)文件的上傳和下載,本文將做一個項目案例來完整的使用springmvc框架實現(xiàn)文件的上傳和下載。

文件上傳

文件上傳是項目開發(fā)中最常見的功能。為了能上傳文件,必須將表單的method設置為post,并將enctype設置為multipart/form-data。只有在這樣的情況下,瀏覽器才會把用戶選擇的文件以二進制數(shù)據(jù)發(fā)送給服務器。

一旦設置了enctype為multipart/form-data,瀏覽器即會采用二進制流的方式來處理表單數(shù)據(jù),而對于文件上傳的處理則涉及在服務器端解析原始的http響應。在2003年,apache software foundation發(fā)布了開源的commons fileupload組件,其很快成為servlet/jsp程序員上傳文件的最佳選擇。

servlet3.0規(guī)范已經(jīng)提供方法來處理文件上傳,但這種上傳需要在servlet中完成。而springmvc則提供了更簡單的封裝。
springmvc為文件上傳提供了直接的支持,這種支持是用即插即用的multipartresolver實現(xiàn)的。springmvc使用apache commons fileupload技術實現(xiàn)了一個multipartresolver實現(xiàn)類:commonsmultipartresolver。因此,springmvc的文件上傳還需要依賴apache commons fileupload的組件。

本項目作為測試案例,在此我就不創(chuàng)建maven項目了,我直接創(chuàng)建的是一個dynamic web project(動態(tài)的web項目),采用tomcat 8作為web服務器,我們需要在項目中引入以下jar包,如下圖:

SpringMVC實現(xiàn)文件的上傳和下載實例代碼

下面我們在webcontent/web-inf下創(chuàng)建一個content文件夾,用于放文件的上傳、下載等jsp文件,下面我們創(chuàng)建uploadform.jsp文件,演示springmvc的文件上傳:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contenttype="text/html; charset=utf-8"
  pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>文件上傳</title>
</head>
<body>
  <h2>文件上傳</h2>
  <form action="upload" enctype="multipart/form-data" method="post">
    <table>
      <tr>
        <td>文件描述:</td>
        <td><input type="text" name="description"></td>
      </tr>
      <tr>
        <td>請選擇文件:</td>
        <td><input type="file" name="file"></td>
      </tr>
      <tr>
        <td><input type="submit" value="上傳"></td>
      </tr>
    </table>
  </form>
</body>
</html>

負責上傳文件的表單和一般表單有一些區(qū)別,負責上傳文件的表單的編碼類型必須是“multipart/form-data”。

我們再src下創(chuàng)建一個包“cn.edu.jseti.controller”,然后創(chuàng)建一個fileuploadcontroller類,用于實現(xiàn)文件的上傳和下載功能。以下是負責上傳文件的表單功能代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//上傳文件會自動綁定到multipartfile中
   @requestmapping(value="/upload",method=requestmethod.post)
   public string upload(httpservletrequest request,
      @requestparam("description") string description,
      @requestparam("file") multipartfile file) throws exception {
 
    system.out.println(description);
    //如果文件不為空,寫入上傳路徑
    if(!file.isempty()) {
      //上傳文件路徑
      string path = request.getservletcontext().getrealpath("/images/");
      //上傳文件名
      string filename = file.getoriginalfilename();
      file filepath = new file(path,filename);
      //判斷路徑是否存在,如果不存在就創(chuàng)建一個
      if (!filepath.getparentfile().exists()) {
        filepath.getparentfile().mkdirs();
      }
      //將上傳文件保存到一個目標文件當中
      file.transferto(new file(path + file.separator + filename));
      return "success";
    } else {
      return "error";
    }
 
   }

springmvc會將上傳的文件綁定到multipartfile對象中。multipartfile提供了獲取上傳文件內容、文件名等方法。通過transferto()方法還可以將文件存儲到硬件中,multipartfile對象中的常用方法如下:

  1. byte[] getbytes():獲取文件數(shù)據(jù)
  2. string getcontenttype[]:獲取文件mime類型,如image/jpeg等
  3. inputstream getinputstream():獲取文件流
  4. string getname():獲取表單中文件組件的名字
  5. string getoriginalfilename():獲取上傳文件的原名
  6. long getsize():獲取文件的字節(jié)大小,單位為byte
  7. boolean isempty():是否有上傳文件
  8. void transferto(file dest):將上傳文件保存到一個目錄文件中

springmvc上下文中默認沒有裝配multipartresolver,因此默認情況下其不能處理文件上傳工作。如果想使用spring的文件上傳功能,則需要在上下文中配置multipartresolver。在springmvc-config.xml進行配置文件如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?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:mvc="http://www.springframework.org/schema/mvc"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemalocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd  
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.2.xsd">
 
  <!-- spring可以自動去掃描base-pack下面的包或者子包下面的java文件,
    如果掃描到有spring的相關注解的類,則把這些類注冊為spring的bean -->
  <context:component-scan base-package="cn.edu.jseti.controller"/>
 
  <!-- 視圖解析器 -->
   <bean id="viewresolver"
     class="org.springframework.web.servlet.view.internalresourceviewresolver">
    <!-- 前綴 -->
    <property name="prefix">
      <value>/web-inf/content/</value>
    </property>
    <!-- 后綴 -->
    <property name="suffix">
      <value>.jsp</value>
    </property>
  </bean>
 
  <bean id="multipartresolver"
    class="org.springframework.web.multipart.commons.commonsmultipartresolver">
    <!-- 上傳文件大小上限,單位為字節(jié)(10mb) -->
    <property name="maxuploadsize">
      <value>10485760</value>
    </property>
    <!-- 請求的編碼格式,必須和jsp的pageencoding屬性一致,以便正確讀取表單的內容,默認為iso-8859-1 -->
    <property name="defaultencoding">
      <value>utf-8</value>
    </property>
  </bean>
 
</beans>

部署fileupload這個web應用,在瀏覽器中輸入如下url來測試應用: http://localhost:8088/fileupload/uploadform

輸入文件描述信息并選擇上傳文件,如下圖:

SpringMVC實現(xiàn)文件的上傳和下載實例代碼

點上傳按鈕,這是已將上傳的文件通過二進制保存到web服務器上去了,如下圖:

SpringMVC實現(xiàn)文件的上傳和下載實例代碼

使用對象接收上傳文件

上面我們通過案例演示了springmvc上傳文件,接下來,我們演示使用對象接收上傳文件。

在實際項目的開發(fā)中,很多時候上傳的文件會作為對象的屬性被保存。springmvc的處理也非常的簡單。

下面我們在content文件夾創(chuàng)建registerform.jsp文件,演示接收文件上傳:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contenttype="text/html; charset=utf-8"
  pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>用戶注冊</title>
</head>
<body>
  <h2>用戶注冊</h2>
  <form action="register" enctype="multipart/form-data" method="post">
    <table>
      <tr>
        <td>用戶名:</td>
        <td><input type="text" name="username"></td>
      </tr>
      <tr>
        <td>請上傳頭像:</td>
        <td><input type="file" name="image"></td>
      </tr>
      <tr>
        <td><input type="submit" value="注冊"></td>
      </tr>
    </table>
  </form>
</body>
</html>

我們在src下面創(chuàng)建一個名叫“cn.edu.jseti.domain”包,然后再創(chuàng)建一個user類,必須要實現(xiàn)序列化接口,如下案例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package cn.edu.jseti.domain;
import java.io.serializable;
 
import org.springframework.web.multipart.multipartfile;
 
/**
 * 博客:http://blog.csdn.net/qian_ch
 * @author cody
 * @version v1.0
 */
 
//域對象,實現(xiàn)序列化接口
public class user implements serializable{
 
  private string username;
  private multipartfile image;
 
  public user() {
    super();
  }
 
  public string getusername() {
    return username;
  }
 
  public void setusername(string username) {
    this.username = username;
  }
 
  public multipartfile getimage() {
    return image;
  }
 
  public void setimage(multipartfile image) {
    this.image = image;
  
 
}

我們在剛才創(chuàng)建的fileuploadcontroller類繼續(xù)寫用于接收文件的上傳和下載功能。以下是負責接收文件的表單功能代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@requestmapping(value="/register")
 public string register(httpservletrequest request,
     @modelattribute user user,
     model model) throws exception {
  system.out.println(user.getusername());
  //如果文件不為空,寫入上傳路徑
  if(!user.getimage().isempty()) {
    //上傳文件路徑
    string path = request.getservletcontext().getrealpath("/images/");
    //上傳文件名
    string filename = user.getimage().getoriginalfilename();
    file filepath = new file(path,filename);
    //判斷路徑是否存在,如果不存在就創(chuàng)建一個
    if (!filepath.getparentfile().exists()) {
      filepath.getparentfile().mkdirs();
    }
    //將上傳文件保存到一個目標文件當中
    user.getimage().transferto(new file(path + file.separator + filename));
    //將用戶添加到model
    model.addattribute("user", user);
    return "userinfo";
  } else {
    return "error";
  }
}

在content文件夾下創(chuàng)建userinfo.jsp文件,該頁面主要是文件的下載頁面,如下jsp代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contenttype="text/html; charset=utf-8"
  pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>文件下載</title>
</head>
<body>
<h3>文件下載</h3>
<a href="download?filename=${requestscope.user.image.originalfilename}" rel="external nofollow" >
  ${requestscope.user.image.originalfilename }
</a>
</body>
</html>

在瀏覽器中輸入如下url來測試應用: http://localhost:8088/fileupload/registerform

輸入用戶名并上傳剛才上傳的文件。如下圖:

SpringMVC實現(xiàn)文件的上傳和下載實例代碼

單擊“注冊”按鈕上傳文件,然后就會跳轉到下載頁面。如下圖:

SpringMVC實現(xiàn)文件的上傳和下載實例代碼

文件下載

上面我們通過案例演示了使用對象接收上傳文件,接下來,我們演示springmvc的下載文件。

文件下載比較簡單,直接在頁面給出了一個超鏈接,該鏈接href的屬性等于要下載文件的文件名,就可以實現(xiàn)文件下載了。但是如果該文件的文件名為中文文件名,在某些早起的瀏覽器上就會導致下載失??;如果使用最新的firefox、chrome、opera、safari則都可以正常下載文件名為中文的文件了。

springmvc提供了一個responseentity類型,使用它可以很方便地定義返回的httpheaders和httpstatus。以下代碼演示文件的下載功能:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@requestmapping(value="/download")
   public responseentity<byte[]> download(httpservletrequest request,
       @requestparam("filename") string filename,
       model model)throws exception {
    //下載文件路徑
    string path = request.getservletcontext().getrealpath("/images/");
    file file = new file(path + file.separator + filename);
    httpheaders headers = new httpheaders();
    //下載顯示的文件名,解決中文名稱亂碼問題
    string downloadfielname = new string(filename.getbytes("utf-8"),"iso-8859-1");
    //通知瀏覽器以attachment(下載方式)打開圖片
    headers.setcontentdispositionformdata("attachment", downloadfielname);
    //application/octet-stream : 二進制流數(shù)據(jù)(最常見的文件下載)。
    headers.setcontenttype(mediatype.application_octet_stream);
    return new responseentity<byte[]>(fileutils.readfiletobytearray(file), 
        headers, httpstatus.created);
   }

download處理方法接收頁面?zhèn)鬟f的文件名filename后,使用apache commons fileupload組件的fileutils讀取項目的上傳文件,并將其構建成responseentity對象返回客戶端下載。

使用responseentity對象,可以很方便的定義返回的httpheaders和httpstatus。上面代碼中的mediatype,代表的是internet media type,即互聯(lián)網(wǎng)媒體類型,也叫做mime類型。在http協(xié)議消息頭中,使用content-type來表示具體請求中的媒體類型信息。httpstatus類型代表的是http協(xié)議中的狀態(tài)。有關mediatype和httpstatus類可以參考springmvc的api文檔。

點擊下載頁面的超鏈接,顯示文件正在下載,如下圖所示:

SpringMVC實現(xiàn)文件的上傳和下載實例代碼

單擊“瀏覽”按鈕,可以選擇下載文件的保存路徑,然后單擊“確定”按鈕,文件就會順利的下載并保存。

本文中的一些功能案例代碼和配置文件不是很完整,下面附上完整代碼:

fileuploadcontroller類完整的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package cn.edu.jseti.controller;
 
import java.io.file;
 
import javax.servlet.http.httpservletrequest;
 
import org.apache.commons.io.fileutils;
import cn.edu.jseti.domain.user;
import org.springframework.http.httpheaders;
import org.springframework.http.httpstatus;
import org.springframework.http.mediatype;
import org.springframework.http.responseentity;
import org.springframework.stereotype.controller;
import org.springframework.ui.model;
import org.springframework.web.bind.annotation.modelattribute;
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;
/**
 * @author cody
 * @version v1.0
 */
@controller
public class fileuploadcontroller {
  @requestmapping(value="/{formname}")
   public string loginform(@pathvariable string formname) {
    // 動態(tài)跳轉頁面
    return formname;
  }
 
  //上傳文件會自動綁定到multipartfile中
   @requestmapping(value="/upload",method=requestmethod.post)
   public string upload(httpservletrequest request,
      @requestparam("description") string description,
      @requestparam("file") multipartfile file) throws exception {
 
    system.out.println(description);
    //如果文件不為空,寫入上傳路徑
    if(!file.isempty()) {
      //上傳文件路徑
      string path = request.getservletcontext().getrealpath("/images/");
      //上傳文件名
      string filename = file.getoriginalfilename();
      file filepath = new file(path,filename);
      //判斷路徑是否存在,如果不存在就創(chuàng)建一個
      if (!filepath.getparentfile().exists()) {
        filepath.getparentfile().mkdirs();
      }
      //將上傳文件保存到一個目標文件當中
      file.transferto(new file(path + file.separator + filename));
      return "success";
    } else {
      return "error";
    }
 
   }
 
   @requestmapping(value="/register")
   public string register(httpservletrequest request,
       @modelattribute user user,
       model model) throws exception {
    system.out.println(user.getusername());
    //如果文件不為空,寫入上傳路徑
    if(!user.getimage().isempty()) {
      //上傳文件路徑
      string path = request.getservletcontext().getrealpath("/images/");
      //上傳文件名
      string filename = user.getimage().getoriginalfilename();
      file filepath = new file(path,filename);
      //判斷路徑是否存在,如果不存在就創(chuàng)建一個
      if (!filepath.getparentfile().exists()) {
        filepath.getparentfile().mkdirs();
      }
      //將上傳文件保存到一個目標文件當中
      user.getimage().transferto(new file(path + file.separator + filename));
      //將用戶添加到model
      model.addattribute("user", user);
      return "userinfo";
    } else {
      return "error";
    }
  }
 
   @requestmapping(value="/download")
   public responseentity<byte[]> download(httpservletrequest request,
       @requestparam("filename") string filename,
       model model)throws exception {
    //下載文件路徑
    string path = request.getservletcontext().getrealpath("/images/");
    file file = new file(path + file.separator + filename);
    httpheaders headers = new httpheaders();
    //下載顯示的文件名,解決中文名稱亂碼問題
    string downloadfielname = new string(filename.getbytes("utf-8"),"iso-8859-1");
    //通知瀏覽器以attachment(下載方式)打開圖片
    headers.setcontentdispositionformdata("attachment", downloadfielname);
    //application/octet-stream : 二進制流數(shù)據(jù)(最常見的文件下載)。
    headers.setcontenttype(mediatype.application_octet_stream);
    return new responseentity<byte[]>(fileutils.readfiletobytearray(file), 
        headers, httpstatus.created);
   }
 
}

文件上傳成功的jsp代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contenttype="text/html; charset=utf-8"
  pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>測試文件上傳</title>
</head>
<body>
  恭喜,您的上傳文件成功!
</body>
</html>

文件上傳失敗的jsp代碼:

?
1
2
3
4
5
6
7
8
9
10
11
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>測試文件上傳</title>
</head>
<body>
  上傳文件失敗!
</body>
</html>

web.xml的配置文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="webapp_id" version="2.5">
 <display-name>multipartfiletest</display-name>
 
 <!-- 定義spring mvc的前端控制器 -->
 <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.dispatcherservlet
  </servlet-class>
  <init-param>
   <param-name>contextconfiglocation</param-name>
   <param-value>/web-inf/springmvc-config.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <!-- 讓spring mvc的前端控制器攔截所有請求 -->
 <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>
 
 <!-- 編碼過濾器 -->
 <filter>
    <filter-name>characterencodingfilter</filter-name>
    <filter-class>org.springframework.web.filter.characterencodingfilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
 </filter>
  <filter-mapping>
    <filter-name>characterencodingfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 
</web-app>

ok,以上就是完整的使用springmvc框架實現(xiàn)了文件的上傳和下載。本中所有的案例都是本人親自測試,如有寫的不對,歡迎朋友們留言一起交流,謝謝!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家

原文鏈接:http://blog.csdn.net/qian_ch/article/details/69258465

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 法国贵妇一级伦理hd | h肉动漫在线视频无修无遮挡 | 操男孩 | 无码AV熟妇素人内射V在线 | 日本强不卡在线观看 | 晚上禁用的十大黄台视频 | 男女一级簧色带 | 亚洲男女在线 | 四影虎库最新2021 | 女人张开腿让男人桶视频免费大全 | 精品亚洲一区二区三区在线播放 | 皇上好大好硬好涨好深好爽 | 性生大片免费看 | 国产精品久久久久久久久久久久久久 | 白丝女仆被啪到深夜漫画 | 亚洲AV无码国产精品色在线看 | 久久学生精品国产自在拍 | 无颜之月全集免费观看 | a级影视| 秋霞在线一级 | 40分钟在线观看免费 | 日本噜噜影院 | 亚洲精品6久久久久中文字幕 | 精品亚洲综合在线第一区 | 日本视频免费在线 | 亚洲成人aa | 久久视频在线视频观看精品15 | 亚洲精品国产精品国自产观看 | 香蕉91xj.cc| 激情小视频 | 美女吃男生鸡鸡 | 欧美色成人tv在线播放 | 视频在线观看一区二区 | 操娇妻 | 国产精品亚洲综合第一区 | 亚洲国产精品久久久久久网站 | 国内体内she精视频免费 | 884hutv四虎永久7777| 免费亚洲视频在线观看 | 国产精品玖玖玖影院 | 欧美大片一区 |