精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android用Retrofit 2實(shí)現(xiàn)多文件上傳實(shí)戰(zhàn)

移動(dòng)開(kāi)發(fā) Android
本文作為階段性小結(jié),將使用結(jié)合Python中的Flask框架實(shí)現(xiàn)Android端多文件上傳功能。如果讀者沒(méi)有使用過(guò)Python中的Flask也沒(méi)有關(guān)系,可以只看Android客戶端部分,畢竟客戶端工程師只使用API也是可以的。

前一段時(shí)間我翻譯了Future Studio的Retrofit2教程,從中也學(xué)習(xí)到了一些Retrofit2的使用方法,如果你最近也打算入手學(xué)習(xí),我博客上Retrofit教程,你也許可以參考下:Retrofit教程

本文作為階段性小結(jié),將使用結(jié)合Python中的Flask框架實(shí)現(xiàn)Android端多文件上傳功能。如果讀者沒(méi)有使用過(guò)Python中的Flask也沒(méi)有關(guān)系,可以只看Android客戶端部分,畢竟客戶端工程師只使用API也是可以的。

1.實(shí)驗(yàn)效果

Android端操作截圖 

 

 

Android端操作截圖 

Server端接收到的圖片 

 

 

Server端接收到的圖片 

2. Server端實(shí)戰(zhàn)

Server端負(fù)責(zé)接收保存客戶端上傳來(lái)的圖片并提供訪問(wèn)圖片的能力,Server有很多技術(shù)可以實(shí)現(xiàn),Python作為一門具有強(qiáng)大的第三方庫(kù)的語(yǔ)言,擁有很多web服務(wù)框架,如Flask,Django等。筆者采用Flask框架,F(xiàn)lask是微框架,實(shí)現(xiàn)小型功能十分方便,筆者實(shí)現(xiàn)的多文件上傳功能,程序不超過(guò)30行。

下面具體來(lái)看看。

2.1 環(huán)境安裝

筆者使用的Python版本為3.4,可以去 Python3.4下載 選擇下載適合自己系統(tǒng)的版本。完整安裝Python教程請(qǐng)自行搜索。

Python安裝完成后需要安裝Server端程序依賴庫(kù)。通過(guò)pip安裝:

  1. pip install Flask 
  2. pip install werkzeug  

2.2 程序?qū)崿F(xiàn)

首先要引入依賴庫(kù):

  1. from flask import Flask,request,send_from_directory,jsonify 
  2. import os 
  3. from werkzeug import secure_filename  

本實(shí)驗(yàn)需要上傳文件,需要將所上傳文件的文件類型以及文件名做出限制,防止某些破壞服務(wù)器的程序運(yùn)行,另外有些非法文件名如:

filename = "../../../../home/username/.bashrc"

如果黑客們能夠操作這樣的文件,對(duì)服務(wù)器系統(tǒng)來(lái)說(shuō),將是致命打擊。所以werkzeug提供了secure_filename對(duì)上傳文件的文件名進(jìn)行合法校驗(yàn)。

判斷文件后綴是否合法

  1. ALLOWED_EXTENSIONS=set(['png','jpg','jpeg','gif']) 
  2. def allowed_file(filename): 
  3. return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS  

接收上傳文件的函數(shù)代碼如下:

  1. @app.route('/upload',methods=['POST']) 
  2. def upload_file(): 
  3. if request.method=='POST'
  4. for k in request.files: 
  5. file = request.files[k] 
  6. image_urls = [] 
  7. if file and allowed_file(file.filename): 
  8. filename=secure_filename(file.filename) 
  9. file.save(os.path.join(app.config['IMAGE_FOLDER'],filename)) 
  10. image_urls.append("images/%s"%filename) 
  11. return jsonify({"code":1,"image_urls":image_urls})  

Flask支持GET,POST,PUT,DELETE等HTTP請(qǐng)求方式,使用裝飾器進(jìn)行修飾,類似于Java中的注解概念,/upload為客戶端請(qǐng)求的相對(duì)地址,請(qǐng)求方式限制為POST.根據(jù)request內(nèi)置對(duì)象,可以訪問(wèn)客戶端發(fā)來(lái)的文件,將文件檢查后保存在本地,其中image_urls為上傳后的圖片的相對(duì)地址數(shù)組。***將圖片的地址以json格式返回給客戶端。

完整的Server端代碼如下:

  1. from flask import Flask,request,send_from_directory,jsonify 
  2.  import os 
  3.  from werkzeug import secure_filename 
  4.  
  5. app = Flask(__name__) 
  6.  app.config['IMAGE_FOLDER'] = os.path.abspath('.')+'\\images\\' 
  7.  ALLOWED_EXTENSIONS=set(['png','jpg','jpeg','gif']) 
  8.  
  9. def allowed_file(filename): 
  10.  return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS 
  11.  
  12. @app.route('/upload',methods=['POST']) 
  13.  def upload_file(): 
  14.  if request.method=='POST'
  15.  for k in request.files: 
  16.  file = request.files[k] 
  17.  print(file) 
  18.  image_urls = [] 
  19.  if file and allowed_file(file.filename): 
  20.  filename=secure_filename(file.filename) 
  21.  file.save(os.path.join(app.config['IMAGE_FOLDER'],filename)) 
  22.  image_urls.append("images/%s"%filename) 
  23.  return jsonify({"code":1,"image_urls":image_urls}) 
  24.  
  25. #讓文件映射訪問(wèn),否則默認(rèn)只能訪問(wèn)static文件夾中的文件 
  26.  @app.route("/images/<imgname>",methods=['GET']) 
  27.  def images(imgname): 
  28.  return send_from_directory(app.config['IMAGE_FOLDER'],imgname) 
  29.  
  30. if __name__ == "__main__"
  31.  
  32. # 檢測(cè) IMAGE_FOLDER 是否存在 
  33.  if not os.path.exists(app.config['IMAGE_FOLDER']): 
  34.  os.mkdir(app.config['IMAGE_FOLDER']) 
  35.  app.run("192.168.1.102",debug=True 

這里有一個(gè)小技巧,寫(xiě)完Server端代碼后可以使用Postman進(jìn)行測(cè)試,測(cè)試成功后再進(jìn)行客戶端程序開(kāi)發(fā)。 

 

 

 

3. 客戶端開(kāi)發(fā)

因?yàn)樯婕拔募纳蟼鳎P者這里以圖片為例進(jìn)行上傳實(shí)驗(yàn),圖片上傳除了重頭戲Retrofit之外,還需要選擇圖片,筆者這里推薦一個(gè)模仿微信的圖片選擇庫(kù) ImagePicker .

3.1 添加依賴庫(kù)

圖片加載庫(kù)筆者喜歡使用Glide

  1. compile 'com.squareup.retrofit2:retrofit:2.1.0' 
  2. compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
  3. compile 'com.github.bumptech.glide:glide:3.7.0' 
  4. compile 'com.lzy.widget:imagepicker:0.4.1'  

3.2 程序?qū)崿F(xiàn)

如果沒(méi)有接觸過(guò)Retrofit 2,可以來(lái)我的博客Retrofit教程 了解。

Retrofit2 是一個(gè)支持RESTful API的請(qǐng)求庫(kù),實(shí)際上只是對(duì)API請(qǐng)求方式的封裝,真正的網(wǎng)絡(luò)請(qǐng)求由OkHttp發(fā)出。

Retrofit2一般會(huì)定義一個(gè)ServiceGenerator類,用于動(dòng)態(tài)生成Retrofit對(duì)象。

  1. public class ServiceGenerator { 
  2. public static final String API_BASE_URL = "http://192.168.1.102:5000/"
  3. private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
  4.   
  5. private static Retrofit.Builder builder = 
  6. new Retrofit.Builder() 
  7. .baseUrl(API_BASE_URL) 
  8. .addConverterFactory(GsonConverterFactory.create()); 
  9.   
  10. public static <S> S createService(Class<S> serviceClass) { 
  11. Retrofit retrofit = builder.client(httpClient.build()).build(); 
  12. return retrofit.create(serviceClass); 
  13.  

具體的API操作由FlaskClient接口操作,

  1. public interface FlaskClient { 
  2.     //上傳圖片 
  3.     @Multipart 
  4.     @POST("/upload"
  5.     Call<UploadResult> uploadMultipleFiles(@PartMap Map<String,RequestBody> files); 
  6.  

上傳文件需要使用@Multipart關(guān)鍵字注解,@POST表明HTTP請(qǐng)求方式為POST,/upload為請(qǐng)求服務(wù)器的相對(duì)地址,uploadMultipleFiles是自定義的方法名,參數(shù)為Map<String,RequestBody> files即多個(gè)文件組成的Map對(duì)象,@PartMap表明這是多文件上傳,如果單文件可以使用@Part MultipartBody.Part file,方法的返回類型默認(rèn)為Response,由于我們已經(jīng)開(kāi)發(fā)了Server端,所以知道Server端的返回?cái)?shù)據(jù)格式為Json,因此我們針對(duì)返回?cái)?shù)據(jù)格式新建一個(gè)UploadResut類。

  1. public class UploadResult { 
  2.      public int code; // 1 
  3.      public List<String> image_urls; 
  4.  

界面布局如圖所示: 

 

 

 

點(diǎn)擊Upload按鈕后執(zhí)行上傳操作,核心的方法:

  1. public void uploadFiles() { 
  2.     if(imagesList.size() == 0) { 
  3.         Toast.makeText(MainActivity.this, "不能不選擇圖片", Toast.LENGTH_SHORT).show(); 
  4.         return
  5.     } 
  6.     Map<String, RequestBody> files = new HashMap<>(); 
  7.     final FlaskClient service = ServiceGenerator.createService(FlaskClient.class); 
  8.     for (int i = 0; i < imagesList.size(); i++) { 
  9.         File file = new File(imagesList.get(i).path); 
  10.         files.put("file" + i + "\"; filename=\"" + file.getName(), RequestBody.create(MediaType.parse(imagesList.get(i).mimeType), file)); 
  11.     } 
  12.     Call<UploadResult> call = service.uploadMultipleFiles(files); 
  13.     call.enqueue(new Callback<UploadResult>() { 
  14.         @Override 
  15.         public void onResponse(Call<UploadResult> call, Response<UploadResult> response) { 
  16.             if (response.isSuccessful() && response.body().code == 1) { 
  17.                 Toast.makeText(MainActivity.this, "上傳成功", Toast.LENGTH_SHORT).show(); 
  18.                 Log.i("orzangleli""---------------------上傳成功-----------------------"); 
  19.                 Log.i("orzangleli""基礎(chǔ)地址為:" + ServiceGenerator.API_BASE_URL); 
  20.                 Log.i("orzangleli""圖片相對(duì)地址為:" + listToString(response.body().image_urls,',')); 
  21.                 Log.i("orzangleli""---------------------END-----------------------"); 
  22.             } 
  23.         } 
  24.         @Override 
  25.         public void onFailure(Call<UploadResult> call, Throwable t) { 
  26.             Toast.makeText(MainActivity.this, "上傳失敗", Toast.LENGTH_SHORT).show(); 
  27.         } 
  28.     }); 
  29.  

其中構(gòu)建上傳多文件的方法的參數(shù)較為關(guān)鍵,MediaType.parse(imagesList.get(i).mimeType)獲取圖片的mimeType,如果指定錯(cuò)誤,可能會(huì)導(dǎo)致上傳失敗。

  1. Map<String, RequestBody> files = new HashMap<>(); 
  2. final FlaskClient service = ServiceGenerator.createService(FlaskClient.class); 
  3. for (int i = 0; i < imagesList.size(); i++) { 
  4.      File file = new File(imagesList.get(i).path); 
  5.      files.put("file" + i + "\"; filename=\"" + file.getName(), RequestBody.create(MediaType.parse(imagesList.get(i).mimeType), file)); 
  6.  

集成Callback借口的匿名回調(diào)類的onResponse方法的第二個(gè)參數(shù)為服務(wù)器響應(yīng),通過(guò)訪問(wèn)body()方法返回UploadResult類型對(duì)象,接著就可以通過(guò)組合ServiceGenerator.API_BASE_URL和response.body().image_urls中每一項(xiàng)訪問(wèn)上傳完成的圖片。

4. 項(xiàng)目地址

本項(xiàng)目Client端和Server端均以開(kāi)源,歡迎各位老總們Star。

Client地址: RetrofitMultiFilesUploadClient

Server地址: MultiFileUploadServer

原文鏈接:http://www.orzangleli.com/2017/04/03/2017-04-03_Android%20%E7%94%A8%20Retrofit%202%20%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%AE%9E%E6%88%98/ 

責(zé)任編輯:龐桂玉 來(lái)源: Android開(kāi)發(fā)中文站
相關(guān)推薦

2009-06-08 16:44:00

Struts2文件上傳

2011-09-14 09:20:03

PhonegapAndroid平臺(tái)

2009-06-03 15:57:29

Struts1.2動(dòng)態(tài)多文件

2009-11-16 10:49:43

PHP上傳文件代碼

2011-09-05 15:09:06

Android平臺(tái)Phonegap

2010-04-07 11:09:53

2009-07-14 17:20:31

Webwork文件上傳

2022-06-13 14:06:33

大文件上傳前端

2024-11-12 09:54:23

2009-11-16 10:40:02

PHP上傳文件代碼

2009-07-23 10:37:43

2016-10-20 19:36:01

androiddagger2依賴注入

2009-11-24 14:52:45

PHP動(dòng)態(tài)多文件上傳

2009-11-16 10:25:40

PHP上傳文件

2009-07-06 17:11:38

Servlet文件上傳

2009-06-26 13:46:13

Struts

2009-11-24 13:15:35

Zend框架PHP上傳文件

2009-11-16 10:16:24

PHP文件上傳

2009-07-08 09:29:58

WebWork

2009-06-25 15:50:03

Struts2教程上傳任意多個(gè)文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

伊人久久大香线蕉av超碰| 毛片在线播放网址| 国产精品www.| 亚洲精品福利在线| 精品国产成人av在线免| 第九色区av在线| 国产精品亚洲综合一区在线观看| 久久久久久久久亚洲| 国产熟妇久久777777| 日本国产亚洲| 欧美日韩国产色视频| 色综合久久av| 免费看黄网站在线观看| 日本在线播放一区二区三区| 久久91亚洲精品中文字幕奶水| 网站免费在线观看| 亚洲色成人www永久网站| 日产午夜精品一线二线三线| 欧美成人艳星乳罩| 中文字幕第80页| 午夜影院免费视频| 蜜桃视频第一区免费观看| 欧美日韩福利电影| 中文字幕在线观看免费高清| 天堂久久av| 欧美性欧美巨大黑白大战| 久久人人爽人人爽人人av| 北岛玲日韩精品一区二区三区| 丁香六月综合激情| 国产久一一精品| 国产毛片aaa| 亚洲精品久久| 亚洲最新av在线网站| 久久久久成人精品无码中文字幕| 久久免费影院| 91成人免费在线视频| 美女黄色免费看| 麻豆传媒视频在线| 国产日韩高清在线| 免费一区二区三区在在线视频| www.蜜桃av.com| 亚洲精品99| 国产亚洲欧洲高清| 四虎永久免费观看| 国产一区一区| 欧美日韩高清在线播放| 欧美两根一起进3p做受视频| 大菠萝精品导航| www.66久久| 热久久免费国产视频| 欧美日韩成人免费观看| 天天超碰亚洲| 欧美mv日韩mv国产| 一级黄色高清视频| 91麻豆精品| 欧美日韩国产高清一区二区三区 | 欧美性猛交xxxx偷拍洗澡| 黄色激情在线视频| 四季久久免费一区二区三区四区| **欧美大码日韩| 91热精品视频| 国产人妻精品一区二区三区| 激情婷婷欧美| 欧美成人免费全部| 亚洲综合网在线| 国产在视频线精品视频www666| 这里是久久伊人| 在线视频观看91| 97精品资源在线观看| 在线不卡免费av| 国产精品自在自线| 免费精品一区| 亚洲国产精品传媒在线观看| 欧美亚洲国产免费| 国产高清在线免费| 亚洲一区中文| 日韩av123| 蜜桃av.com| 91精品啪在线观看国产18| 美女视频久久黄| 日本三级2019| 国产电影一区二区在线观看| 久热在线中文字幕色999舞| 9999热视频| 国产精品v亚洲精品v日韩精品| 国内精品久久久久伊人av| 国产专区第一页| 奇米影视在线99精品| 91美女片黄在线观| 成人毛片在线免费观看| 99视频精品在线| 国产精品久久久久久久天堂第1集| 刘亦菲毛片一区二区三区| 97se亚洲国产综合自在线| 日韩视频精品| 天堂av资源在线观看| 欧美午夜电影在线| 97超碰人人爽| 全国精品免费看| 色婷婷av一区二区三区久久| 免费中文字幕视频| 久久久久一区| 69av在线视频| 中文在线观看免费高清| 国产福利精品一区二区| 国产日韩欧美视频在线| 亚洲AV午夜精品| 久久九九99视频| 青青草综合视频| 欧美大片免费观看网址| 欧美日韩性视频在线| 国产三级国产精品国产专区50| 日韩精品免费视频一区二区三区 | 国产精品视频免费观看www| 精品久久久无码中文字幕| 久久综合久色欧美综合狠狠| 久久久无码中文字幕久...| 国产精品伦理| 亚洲第一中文字幕| 男人与禽猛交狂配| 日韩黄色片在线观看| 成人免费视频网站入口| 亚洲成人影院麻豆| 日韩欧美在线观看| 精品人妻二区中文字幕| 四虎8848精品成人免费网站| 欧洲成人免费aa| 黄色一级a毛片| 亚洲色图欧美偷拍| 黄色三级视频片| 天堂一区二区三区四区| 欧美国产日韩一区二区在线观看 | 日韩欧美国产综合| 欧美xxxx精品| 视频一区在线播放| 久久精品日韩| caoporn-草棚在线视频最| 国产精品网友自拍| 成人一对一视频| 538任你躁精品视频网免费| 久久黄色av网站| 国产美女www爽爽爽| 久久在线观看免费| 亚洲午夜精品久久久久久人妖| av综合网站| 日韩精品在线视频美女| 18精品爽视频在线观看| 国产一区二区三区免费看| 亚洲午夜精品久久| 日韩另类在线| 日韩一本二本av| 看免费黄色录像| 国内精品第一页| 色呦呦网站入口| aa视频在线观看| 欧美xxxx在线观看| 久久久.www| 懂色av一区二区夜夜嗨| 日韩精品综合在线| 成人直播在线观看| 久久久久久久久久久免费精品| 日批免费在线观看| 亚瑟在线精品视频| 中国极品少妇videossexhd| 国内精品亚洲| 久久久久久久免费| 婷婷综合六月| 日韩中文字幕免费视频| 国产精品高潮呻吟av| 亚洲另类一区二区| 岛国av免费观看| 国产精品久久国产愉拍| 日本一区二区三区免费看| 精品日本视频| 久久精品视频导航| 丰满人妻一区二区三区四区53 | 亚洲欧美激情另类校园| 国产精品久久久久久成人| 美女视频一区二区| 最近中文字幕免费mv| 91综合久久爱com| 69影院欧美专区视频| 韩国中文字幕2020精品| 欧美人妖巨大在线| 精品少妇一二三区| 2023国产精品自拍| 国产精品区在线| 一区在线免费观看| 日本一区二区三区免费看| 国产精品一区二区三区av| 91wwwcom在线观看| 日本三级在线播放完整版| 日韩片之四级片| 久久人妻免费视频| 亚洲欧洲综合另类| jizz欧美性20| 国产一区二区三区日韩| 99福利在线观看| 自产国语精品视频| 欧美日韩亚洲一区二区三区在线观看 | 日本一二三不卡| 一级黄色免费视频| 另类欧美日韩国产在线| 农民人伦一区二区三区| 不卡视频在线| 欧美整片在线观看| 欧美96在线| 亚洲免费视频观看| 精品人妻少妇AV无码专区| 一本色道**综合亚洲精品蜜桃冫| 国产免费美女视频| 精品一区二区三区影院在线午夜| 大伊香蕉精品视频在线| 日韩在线第七页| 精品毛片久久久久久| 91精品在线免费视频| 国产成人午夜视频网址| 蜜桃传媒在线观看免费进入| 日韩久久精品一区| 一区二区三区麻豆| 亚洲成人av电影| 免费高清在线观看电视| 欧美国产精品中文字幕| 少妇户外露出[11p]| 国产麻豆一精品一av一免费| 9久久婷婷国产综合精品性色 | 欧美超级免费视 在线| 福利视频在线导航| 亚洲欧美国产一本综合首页| 欧美性猛交 xxxx| 日韩视频免费观看高清在线视频| 136福利视频导航| 欧美影视一区在线| 综合网在线观看| 欧美日韩国产精品专区| 伊人久久综合视频| 91丨porny丨蝌蚪视频| 中文字幕日韩久久| 久久99久久久久| 国产视频一区二区视频| 美女91精品| 亚洲自偷自拍熟女另类| 国产日韩欧美一区在线| 妞干网在线视频观看| 在线不卡视频| 分分操这里只有精品| 亚洲一级高清| 亚洲色欲久久久综合网东京热| 亚洲最新av| 污污污污污污www网站免费| 欧美在线高清| 久久99精品久久久水蜜桃| 99re6热只有精品免费观看| 97伦理在线四区| 91精品丝袜国产高跟在线| 成人18视频| 成人自拍在线| 精品无人区一区二区三区| 丝袜av一区| 日本一区二区三区视频在线观看 | 亚洲国产精品推荐| 少妇一区二区三区四区| 日韩成人激情视频| 欧美扣逼视频| 最近2019中文免费高清视频观看www99 | 免看一级a毛片一片成人不卡| 樱花影视一区二区| 国产亚洲欧美精品久久久久久| 亚洲国产综合视频在线观看| wwwxxx亚洲| 欧美亚洲高清一区| 国产露脸91国语对白| 精品乱人伦小说| 三级视频在线播放| 中文字幕亚洲欧美| 99热国产在线| 7m精品福利视频导航| 日韩久久一区二区三区| 91精品美女在线| 高清欧美性猛交xxxx黑人猛| 欧美国产综合视频| 久久激情电影| 久久综合久久网| 日本女优在线视频一区二区| 久久久福利影院| 99精品热视频| 日本裸体美女视频| 精品久久久香蕉免费精品视频| 精品久久久久久久久久久久久久久久久久| 欧美三级韩国三级日本三斤| 亚洲AV无码一区二区三区性| 亚洲男人的天堂在线播放| 美女羞羞视频在线观看| 国内精品小视频| 激情久久99| 精品一区二区国产| 99re6这里只有精品| 妞干网在线视频观看| 精品影院一区二区久久久| 少妇被狂c下部羞羞漫画| 国产精品大尺度| 久久艹免费视频| 欧美一二三区在线| 麻豆av电影在线观看| 欧美激情亚洲精品| 国产成人精品一区二区三区视频| 成人黄动漫网站免费| 人人狠狠综合久久亚洲婷| 国产男女免费视频| 国产一区二区影院| 日韩一级av毛片| 五月开心婷婷久久| 国产精品女人久久久| 亚洲女人天堂成人av在线| 日本中文字幕中出在线| 国产精品视频xxx| 欧美一区二区三区红桃小说| 手机在线视频你懂的| 日韩av电影天堂| 久久精品综合视频| 一区二区三区四区激情| 在线观看亚洲国产| 亚洲人午夜精品| 国产一二三在线| 国产精品免费一区二区三区四区 | 成人动态视频| 亚洲黄色网址在线观看| 久久国产剧场电影| 中文字幕第24页| 色综合中文综合网| 四虎精品一区二区三区| 欧美激情a在线| 国产精品一级在线观看| 亚洲成色www久久网站| 日韩在线一区二区| 午夜理伦三级做爰电影| 精品成人av一区| 亚洲色图另类小说| 国内偷自视频区视频综合| 盗摄牛牛av影视一区二区| 蜜桃网站在线观看| 国产麻豆91精品| 欧美黑人性猛交xxx| 91麻豆精品91久久久久久清纯| 在线观看黄av| 国产一区二区视频在线观看| 久久在线视频| 日本在线观看视频一区| 中文字幕制服丝袜一区二区三区| 中文字幕乱码无码人妻系列蜜桃| 亚洲一区www| 97成人超碰| 日本一区二区免费高清视频| 久久99精品久久久久久国产越南| 亚洲综合图片一区| 91精品中文字幕一区二区三区| 国产欧美久久久久久久久| 成人做爰www免费看视频网站| 91精品国偷自产在线电影| 99久久综合网| 亚洲图片自拍偷拍| 视频一区二区在线播放| 国产成人久久久| 日韩在线观看一区| 爱豆国产剧免费观看大全剧苏畅| 亚洲欧洲综合另类在线 | 亚洲乱码国产乱码精品精| 伊人网在线播放| 色综合久久av| 国产成人啪午夜精品网站男同| 国产在线成人精品午夜| 日韩精品电影网| 国产福利91精品一区二区| 干日本少妇视频| 99在线精品免费| 在线免费观看av片| 欧美日韩国产成人高清视频| 久久夜色电影| 九色91popny| 一区二区三区在线不卡| 熟妇人妻系列aⅴ无码专区友真希| 国产91精品在线播放| 国产精品videosex性欧美| 9.1在线观看免费| 色婷婷综合久久久中文一区二区| 毛片激情在线观看| 国产精品推荐精品| 爽好久久久欧美精品| 国产日韩欧美在线观看视频| 亚洲精品在线网站| 欧美aaa视频| 国产成a人亚洲精v品在线观看| 久久精品亚洲精品国产欧美kt∨| 国产成人毛毛毛片| 欧美在线性视频| 欧美在线精品一区| 午夜在线观看一区| 日韩欧美国产一区二区在线播放 | 欧美精品高清视频| bl在线肉h视频大尺度|