国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

大文件上傳時如何做到秒傳?

共 19053字,需瀏覽 39分鐘

 ·

2022-07-05 12:18

不點(diǎn)藍(lán)字關(guān)注,我們哪來故事?

  • 前言
  • 詳細(xì)教程
    • 秒傳
    • 分片上傳
    • 斷點(diǎn)續(xù)傳
    • 后端進(jìn)行寫入操作的核心代碼
  • 總結(jié)

前言

文件上傳是一個老生常談的話題了,在文件相對比較小的情況下,可以直接把文件轉(zhuǎn)化為字節(jié)流上傳到服務(wù)器,但在文件比較大的情況下,用普通的方式進(jìn)行上傳,這可不是一個好的辦法,畢竟很少有人會忍受,當(dāng)文件上傳到一半中斷后,繼續(xù)上傳卻只能重頭開始上傳,這種讓人不爽的體驗。那有沒有比較好的上傳體驗?zāi)?,答案有的,就是下邊要介紹的幾種上傳方式

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能。

項目地址:https://github.com/YunaiV/ruoyi-vue-pro

詳細(xì)教程

秒傳

1、什么是秒傳

通俗的說,你把要上傳的東西上傳,服務(wù)器會先做MD5校驗,如果服務(wù)器上有一樣的東西,它就直接給你個新地址,其實你下載的都是服務(wù)器上的同一個文件,想要不秒傳,其實只要讓MD5改變,就是對文件本身做一下修改(改名字不行),例如一個文本文件,你多加幾個字,MD5就變了,就不會秒傳了.

2、本文實現(xiàn)的秒傳核心邏輯

a、利用redis的set方法存放文件上傳狀態(tài),其中key為文件上傳的md5,value為是否上傳完成的標(biāo)志位,

b、當(dāng)標(biāo)志位true為上傳已經(jīng)完成,此時如果有相同文件上傳,則進(jìn)入秒傳邏輯。如果標(biāo)志位為false,則說明還沒上傳完成,此時需要在調(diào)用set的方法,保存塊號文件記錄的路徑,其中key為上傳文件md5加一個固定前綴,value為塊號文件記錄路徑

分片上傳

1.什么是分片上傳

分片上傳,就是將所要上傳的文件,按照一定的大小,將整個文件分隔成多個數(shù)據(jù)塊(我們稱之為Part)來進(jìn)行分別上傳,上傳完之后再由服務(wù)端對所有上傳的文件進(jìn)行匯總整合成原始的文件。

2.分片上傳的場景

1.大文件上傳

2.網(wǎng)絡(luò)環(huán)境環(huán)境不好,存在需要重傳風(fēng)險的場景

斷點(diǎn)續(xù)傳

1、什么是斷點(diǎn)續(xù)傳

斷點(diǎn)續(xù)傳是在下載或上傳時,將下載或上傳任務(wù)(一個文件或一個壓縮包)人為的劃分為幾個部分,每一個部分采用一個線程進(jìn)行上傳或下載,如果碰到網(wǎng)絡(luò)故障,可以從已經(jīng)上傳或下載的部分開始繼續(xù)上傳或者下載未完成的部分,而沒有必要從頭開始上傳或者下載。本文的斷點(diǎn)續(xù)傳主要是針對斷點(diǎn)上傳場景。

2、應(yīng)用場景

斷點(diǎn)續(xù)傳可以看成是分片上傳的一個衍生,因此可以使用分片上傳的場景,都可以使用斷點(diǎn)續(xù)傳。

3、實現(xiàn)斷點(diǎn)續(xù)傳的核心邏輯

在分片上傳的過程中,如果因為系統(tǒng)崩潰或者網(wǎng)絡(luò)中斷等異常因素導(dǎo)致上傳中斷,這時候客戶端需要記錄上傳的進(jìn)度。在之后支持再次上傳時,可以繼續(xù)從上次上傳中斷的地方進(jìn)行繼續(xù)上傳。

為了避免客戶端在上傳之后的進(jìn)度數(shù)據(jù)被刪除而導(dǎo)致重新開始從頭上傳的問題,服務(wù)端也可以提供相應(yīng)的接口便于客戶端對已經(jīng)上傳的分片數(shù)據(jù)進(jìn)行查詢,從而使客戶端知道已經(jīng)上傳的分片數(shù)據(jù),從而從下一個分片數(shù)據(jù)開始繼續(xù)上傳。

4、實現(xiàn)流程步驟

a、方案一,常規(guī)步驟

  • 將需要上傳的文件按照一定的分割規(guī)則,分割成相同大小的數(shù)據(jù)塊;
  • 初始化一個分片上傳任務(wù),返回本次分片上傳唯一標(biāo)識;
  • 按照一定的策略(串行或并行)發(fā)送各個分片數(shù)據(jù)塊;
  • 發(fā)送完成后,服務(wù)端根據(jù)判斷數(shù)據(jù)上傳是否完整,如果完整,則進(jìn)行數(shù)據(jù)塊合成得到原始文件。

b、方案二、本文實現(xiàn)的步驟

  • 前端(客戶端)需要根據(jù)固定大小對文件進(jìn)行分片,請求后端(服務(wù)端)時要帶上分片序號和大小
  • 服務(wù)端創(chuàng)建conf文件用來記錄分塊位置,conf文件長度為總分片數(shù),每上傳一個分塊即向conf文件中寫入一個127,那么沒上傳的位置就是默認(rèn)的0,已上傳的就是Byte.MAX_VALUE 127(這步是實現(xiàn)斷點(diǎn)續(xù)傳和秒傳的核心步驟)
  • 服務(wù)器按照請求數(shù)據(jù)中給的分片序號和每片分塊大?。ǚ制笮∈枪潭ㄇ乙粯拥模┧愠鲩_始位置,與讀取到的文件片段數(shù)據(jù),寫入文件。
5、分片上傳/斷點(diǎn)上傳代碼實現(xiàn)

a、前端采用百度提供的webuploader的插件,進(jìn)行分片。因本文主要介紹服務(wù)端代碼實現(xiàn),webuploader如何進(jìn)行分片,具體實現(xiàn)可以查看如下鏈接:

http://fex.baidu.com/webuploader/getting-started.html

b、后端用兩種方式實現(xiàn)文件寫入,一種是用RandomAccessFile,如果對RandomAccessFile不熟悉的朋友,可以查看如下鏈接:

https://blog.csdn.net/dimudan2015/article/details/81910690

另一種是使用MappedByteBuffer,對MappedByteBuffer不熟悉的朋友,可以查看如下鏈接進(jìn)行了解:

https://www.jianshu.com/p/f90866dcbffc

后端進(jìn)行寫入操作的核心代碼

a、RandomAccessFile實現(xiàn)方式

@UploadMode(mode = UploadModeEnum.RANDOM_ACCESS)  
@Slf4j  
public class RandomAccessUploadStrategy extends SliceUploadTemplate {  
  
  @Autowired  
  private FilePathUtil filePathUtil;  
  
  @Value("${upload.chunkSize}")  
  private long defaultChunkSize;  
  
  @Override  
  public boolean upload(FileUploadRequestDTO param) {  
    RandomAccessFile accessTmpFile = null;  
    try {  
      String uploadDirPath = filePathUtil.getPath(param);  
      File tmpFile = super.createTmpFile(param);  
      accessTmpFile = new RandomAccessFile(tmpFile, "rw");  
      //這個必須與前端設(shè)定的值一致  
      long chunkSize = Objects.isNull(param.getChunkSize()) ? defaultChunkSize * 1024 * 1024  
          : param.getChunkSize();  
      long offset = chunkSize * param.getChunk();  
      //定位到該分片的偏移量  
      accessTmpFile.seek(offset);  
      //寫入該分片數(shù)據(jù)  
      accessTmpFile.write(param.getFile().getBytes());  
      boolean isOk = super.checkAndSetUploadProgress(param, uploadDirPath);  
      return isOk;  
    } catch (IOException e) {  
      log.error(e.getMessage(), e);  
    } finally {  
      FileUtil.close(accessTmpFile);  
    }  
   return false;  
  }  
  
}  

b、MappedByteBuffer實現(xiàn)方式

@UploadMode(mode = UploadModeEnum.MAPPED_BYTEBUFFER)  
@Slf4j  
public class MappedByteBufferUploadStrategy extends SliceUploadTemplate {  
  
  @Autowired  
  private FilePathUtil filePathUtil;  
  
  @Value("${upload.chunkSize}")  
  private long defaultChunkSize;  
  
  @Override  
  public boolean upload(FileUploadRequestDTO param) {  
  
    RandomAccessFile tempRaf = null;  
    FileChannel fileChannel = null;  
    MappedByteBuffer mappedByteBuffer = null;  
    try {  
      String uploadDirPath = filePathUtil.getPath(param);  
      File tmpFile = super.createTmpFile(param);  
      tempRaf = new RandomAccessFile(tmpFile, "rw");  
      fileChannel = tempRaf.getChannel();  
  
      long chunkSize = Objects.isNull(param.getChunkSize()) ? defaultChunkSize * 1024 * 1024  
          : param.getChunkSize();  
      //寫入該分片數(shù)據(jù)  
      long offset = chunkSize * param.getChunk();  
      byte[] fileData = param.getFile().getBytes();  
      mappedByteBuffer = fileChannel  
.map(FileChannel.MapMode.READ_WRITE, offset, fileData.length);  
      mappedByteBuffer.put(fileData);  
      boolean isOk = super.checkAndSetUploadProgress(param, uploadDirPath);  
      return isOk;  
  
    } catch (IOException e) {  
      log.error(e.getMessage(), e);  
    } finally {  
  
      FileUtil.freedMappedByteBuffer(mappedByteBuffer);  
      FileUtil.close(fileChannel);  
      FileUtil.close(tempRaf);  
  
    }  
  
    return false;  
  }  
  
}  

c、文件操作核心模板類代碼

@Slf4j  
public abstract class SliceUploadTemplate implements SliceUploadStrategy {  
  
  public abstract boolean upload(FileUploadRequestDTO param);  
  
  protected File createTmpFile(FileUploadRequestDTO param) {  
  
    FilePathUtil filePathUtil = SpringContextHolder.getBean(FilePathUtil.class);  
    param.setPath(FileUtil.withoutHeadAndTailDiagonal(param.getPath()));  
    String fileName = param.getFile().getOriginalFilename();  
    String uploadDirPath = filePathUtil.getPath(param);  
    String tempFileName = fileName + "_tmp";  
    File tmpDir = new File(uploadDirPath);  
    File tmpFile = new File(uploadDirPath, tempFileName);  
    if (!tmpDir.exists()) {  
      tmpDir.mkdirs();  
    }  
    return tmpFile;  
  }  
  
  @Override  
  public FileUploadDTO sliceUpload(FileUploadRequestDTO param) {  
  
    boolean isOk = this.upload(param);  
    if (isOk) {  
      File tmpFile = this.createTmpFile(param);  
      FileUploadDTO fileUploadDTO = this.saveAndFileUploadDTO(param.getFile().getOriginalFilename(), tmpFile);  
      return fileUploadDTO;  
    }  
    String md5 = FileMD5Util.getFileMD5(param.getFile());  
  
    Map<Integer, String> map = new HashMap<>();  
    map.put(param.getChunk(), md5);  
    return FileUploadDTO.builder().chunkMd5Info(map).build();  
  }  
  
  /**  
   * 檢查并修改文件上傳進(jìn)度  
   */
  
  public boolean checkAndSetUploadProgress(FileUploadRequestDTO param, String uploadDirPath) {  
  
    String fileName = param.getFile().getOriginalFilename();  
    File confFile = new File(uploadDirPath, fileName + ".conf");  
    byte isComplete = 0;  
    RandomAccessFile accessConfFile = null;  
    try {  
      accessConfFile = new RandomAccessFile(confFile, "rw");  
      //把該分段標(biāo)記為 true 表示完成  
      System.out.println("set part " + param.getChunk() + " complete");  
      //創(chuàng)建conf文件文件長度為總分片數(shù),每上傳一個分塊即向conf文件中寫入一個127,那么沒上傳的位置就是默認(rèn)0,已上傳的就是Byte.MAX_VALUE 127  
      accessConfFile.setLength(param.getChunks());  
      accessConfFile.seek(param.getChunk());  
      accessConfFile.write(Byte.MAX_VALUE);  
  
      //completeList 檢查是否全部完成,如果數(shù)組里是否全部都是127(全部分片都成功上傳)  
      byte[] completeList = FileUtils.readFileToByteArray(confFile);  
      isComplete = Byte.MAX_VALUE;  
      for (int i = 0; i < completeList.length && isComplete == Byte.MAX_VALUE; i++) {  
        //與運(yùn)算, 如果有部分沒有完成則 isComplete 不是 Byte.MAX_VALUE  
        isComplete = (byte) (isComplete & completeList[i]);  
        System.out.println("check part " + i + " complete?:" + completeList[i]);  
      }  
  
    } catch (IOException e) {  
      log.error(e.getMessage(), e);  
    } finally {  
      FileUtil.close(accessConfFile);  
    }  
 boolean isOk = setUploadProgress2Redis(param, uploadDirPath, fileName, confFile, isComplete);  
    return isOk;  
  }  
  
  /**  
   * 把上傳進(jìn)度信息存進(jìn)redis  
   */
  
  private boolean setUploadProgress2Redis(FileUploadRequestDTO param, String uploadDirPath,  
      String fileName, File confFile, byte isComplete)
 
{  
  
    RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);  
    if (isComplete == Byte.MAX_VALUE) {  
      redisUtil.hset(FileConstant.FILE_UPLOAD_STATUS, param.getMd5(), "true");  
      redisUtil.del(FileConstant.FILE_MD5_KEY + param.getMd5());  
      confFile.delete();  
      return true;  
    } else {  
      if (!redisUtil.hHasKey(FileConstant.FILE_UPLOAD_STATUS, param.getMd5())) {  
        redisUtil.hset(FileConstant.FILE_UPLOAD_STATUS, param.getMd5(), "false");  
        redisUtil.set(FileConstant.FILE_MD5_KEY + param.getMd5(),  
            uploadDirPath + FileConstant.FILE_SEPARATORCHAR + fileName + ".conf");  
      }  
  
      return false;  
    }  
  }  
/**  
   * 保存文件操作  
   */
  
  public FileUploadDTO saveAndFileUploadDTO(String fileName, File tmpFile) {  
  
    FileUploadDTO fileUploadDTO = null;  
  
    try {  
  
      fileUploadDTO = renameFile(tmpFile, fileName);  
      if (fileUploadDTO.isUploadComplete()) {  
        System.out  
            .println("upload complete !!" + fileUploadDTO.isUploadComplete() + " name=" + fileName);  
        //TODO 保存文件信息到數(shù)據(jù)庫  
  
      }  
  
    } catch (Exception e) {  
      log.error(e.getMessage(), e);  
    } finally {  
  
    }  
    return fileUploadDTO;  
  }  
/**  
   * 文件重命名  
   *  
   * @param toBeRenamed 將要修改名字的文件  
   * @param toFileNewName 新的名字  
   */
  
  private FileUploadDTO renameFile(File toBeRenamed, String toFileNewName) {  
    //檢查要重命名的文件是否存在,是否是文件  
    FileUploadDTO fileUploadDTO = new FileUploadDTO();  
    if (!toBeRenamed.exists() || toBeRenamed.isDirectory()) {  
      log.info("File does not exist: {}", toBeRenamed.getName());  
      fileUploadDTO.setUploadComplete(false);  
      return fileUploadDTO;  
    }  
    String ext = FileUtil.getExtension(toFileNewName);  
    String p = toBeRenamed.getParent();  
    String filePath = p + FileConstant.FILE_SEPARATORCHAR + toFileNewName;  
    File newFile = new File(filePath);  
    //修改文件名  
    boolean uploadFlag = toBeRenamed.renameTo(newFile);  
  
    fileUploadDTO.setMtime(DateUtil.getCurrentTimeStamp());  
    fileUploadDTO.setUploadComplete(uploadFlag);  
    fileUploadDTO.setPath(filePath);  
    fileUploadDTO.setSize(newFile.length());  
    fileUploadDTO.setFileExt(ext);  
    fileUploadDTO.setFileId(toFileNewName);  
  
    return fileUploadDTO;  
  }  
}  

基于微服務(wù)的思想,構(gòu)建在 B2C 電商場景下的項目實戰(zhàn)。核心技術(shù)棧,是 Spring Boot + Dubbo 。未來,會重構(gòu)成 Spring Cloud Alibaba 。

項目地址:https://github.com/YunaiV/onemall

總結(jié)

在實現(xiàn)分片上傳的過程,需要前端和后端配合,比如前后端的上傳塊號的文件大小,前后端必須得要一致,否則上傳就會有問題。其次文件相關(guān)操作正常都是要搭建一個文件服務(wù)器的,比如使用fastdfs、hdfs等。

本示例代碼在電腦配置為4核內(nèi)存8G情況下,上傳24G大小的文件,上傳時間需要30多分鐘,主要時間耗費(fèi)在前端的md5值計算,后端寫入的速度還是比較快。如果項目組覺得自建文件服務(wù)器太花費(fèi)時間,且項目的需求僅僅只是上傳下載,那么推薦使用阿里的oss服務(wù)器,其介紹可以查看官網(wǎng):

https://help.aliyun.com/product/31815.html

阿里的oss它本質(zhì)是一個對象存儲服務(wù)器,而非文件服務(wù)器,因此如果有涉及到大量刪除或者修改文件的需求,oss可能就不是一個好的選擇。

文末提供一個oss表單上傳的鏈接demo,通過oss表單上傳,可以直接從前端把文件上傳到oss服務(wù)器,把上傳的壓力都推給oss服務(wù)器:

https://www.cnblogs.com/ossteam/p/4942227.html


////// END //////
↓ 點(diǎn)擊下方關(guān)注,看更多架構(gòu)分享 ↓
瀏覽 35
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩性网| 亚洲AV黄色| 91国产免费视频| 有码在线播放| 天天射天天| 中文av在线播放| AV在线影院| 免费黄色视频网站大全| 男女啪啪啪网站| 亚洲色人妻| 中文字幕东京热加勒比| 插进去综合网| 日本黄色三级视频| 中文字幕AⅤ在线| 天天看天天摸| 色欲91| 免费看无码| 大香蕉伊人手机在线| 日韩三级片AV| 土耳其电影《爱与罚》| 国产人人操| 亚洲色综合| 中文字幕人妻一区| 色热热| 欧洲精品视频在线观看| 中文字幕亚洲视频在线观看| 国产精品美女在线观看| 波多野结衣在线无码视频| 中文字幕无码乱伦| 性爱视频91| 国产免费一区二区三区网站免费| 啪啪啪免费网站| 天天干天天草| 国产特级毛片| 日韩免费在线观看视频| 人人草人人看| 大黑人荫蒂BBBBBBBBB| 亚洲午夜在线| 国产视频1区| 黄色精品网站| 大炕上公让我高潮了六次| 国产精品国产三级国产AⅤ中文| 欧美V在线| 五月丁香婷婷久久| 欧美一区电影| 日色色色| 91成人篇| 天天爽夜夜爽AA片免费| 操极品美女| 青操av| 91外围女视频| 大乳奶一级婬片A片| 日韩一区二区视频| 无码国产精品一区二区免费96| 国模吧一区| 亚洲综合视频在线观看| av大全在线观看| 黄色片视频在线观看| 一道本高清无码视频| 中文字幕高清无码在线观看| 亚洲免费观看高清完整版在va线观看| 亚洲日韩欧美成人| 日韩一本| 黄色视频导航| 色欲影音| 毛片网站免费| 无码精品成人观看A片| 人人看AV| 中文字幕乱码中文乱码91| 99综合久久| 婷婷综合一区| 国产一在线| 国产黄色视频免费看| 国产午夜精品一区二区三区牛牛 | 欧美色图1| 国产精品2| 四虎午夜福利| 三级日韩视频| 精品中文字幕视频| 操逼网123首页| 黄色片一级片| 国产精品国产三级囯产普通话2 | 久久成人综合网| 91在线无码精品国产三年 | 操鸡视频在线观看| av一区二区在线观看| 人人妻人人爱人人| 日韩AV自拍| 豆花视频免费| 99国产在线观看免费视频| 逼逼影院| 中文在线无码| 天天干无码| 亚洲乱码中文字幕| 国产麻豆性爱视频| 高清无码在线不卡| 五十路AV| 日本精品二区| 日屄视频在线观看| 欧美大香蕉视频| 国产成人久久| 五月天干美女| 久久人妻无码| 欧美精品无码一区二区| 国产精品一区二区黑人巨大| 亚洲美女视频网| 男人v天堂| 日韩欧美人妻无码精品| 成人午夜无码| 在线操B| 麻豆三级片在线观看| 色爽AV| 狠狠操狠狠撸| 波多野结衣无码AV在线| 婷婷久久五月| 你懂的在线视频| 亚洲国产熟妇综合色专区| 老女人操逼网| 亚洲av二区| 高清无码视频免费版本在线观看| 99热国品| а中文在线天堂精品| 99久久久国产| 大香蕉精品在线视频| 毛多水多丰满女人A片| 岛国无码在线观看| 欧美口爆| 中文字幕永久在线5| 天天综合字幕一区二区| 国产又粗又长又硬又大毛苴茸图片| 国产在线精品自拍| 97超碰成人| 亚洲乱码中文字幕| 精品无码专区| 天天爽天天爽| 午夜黄色| 日韩成人视屏| 手机无码在线播放| 日批无码| 色婷婷在线影院| 亚洲调教| 99久视频| 少妇一级| footjobvk| www人人操| 青春草在线视频免费观看| 激情免费网站| 加勒比无码在线播放| 日韩少妇视频| 成人免费版欧美州| 国产美女被操| 污污污污污www网站免费民国 | 嫩草99| 亚洲中文无码AV在线| 无码aⅴ| 无码探花| 国产视频无码| 操逼免费看| 四虎影院中文字幕| 免费无码婬片AAAAA片| eeuss久久| 亚洲中文字幕在| 2025AV天堂| 91Av视频| 久久91人妻无码精品蜜桃HD| 国产成人小电影| 国产欧美日韩视频| 一区二区水蜜桃| 人人摸人人干人人操| 97国产在线| 麻豆精品传媒国产剧的特点| 人人爽人人爽人人| 亚洲AV成人无码精品| 五月天激情综合网| 亚洲免费三级片| 黄色大片久草| 福利视频免费观看| 丁香五月亚洲| 俺去俺来也www色官网cms| 亚洲精品福利| 日本三级网址| 熟女影音先锋| 国产精品国产三级国产专区53| 黑人大荫蒂女同互磨| 在线中文字幕视频| 大香蕉最新国产2025| 岛国免费视频| 99久久精品国产一区二区三区| 亚洲综合在线网| 大香蕉中文在线| 久久99高清视频| 9999re| 九九综合网| 亚洲AV免费看| 91AV视频在线观看| 成人久久大香蕉| 豆花视频在线看| 日本伊人大香蕉| 波多野结衣无码视频在线观看| 日都一级A片| 北岛玲丝袜办公室高跟| 黄色电影视频网站| 99久久99久久精品免费看蜜桃| 欧美一区二区三区婷婷五月| 婷婷丁香五月花| 国产精品美女毛片j酒店| 俺去久久| 草逼免费视频| 日韩A级视频| 黄色操逼大片| 极品少妇AV| 亚洲欧美色图| 热久久国产| 国产成人免费视频在线| 成人精品久久久| 三级片日本在线| 午夜福利无码电影| 亚洲精品A| 性BBwBBwBBwBBw禽| 人人爽网站| 黄色电影视频在线| 无码人妻精品一区二区三区99仓 | 国产乱伦中文字幕| 欧美另类激情| 日本黄色的视频| 国产中文自拍| 一区免费在线观看| 中文无码字幕在线| 熟妇人妻中文字幕无码老熟妇| 北条麻妃在线观看香蕉| 中文字幕国产一区| 九九热国产视频| 亚洲天堂自拍| 人妖和人妖互交性XXXX视频 | 天天天做夜夜夜夜爽无码| 无码蜜桃吴梦梦| 午夜黄色小视频| 亚洲福利电影| 天天澡日日久| 超碰2022| 国内精品无码| 大香蕉亚洲网| 特级AV| 日韩AV无码电影| 中文字幕高清无码在线播放| 中文字幕人妻在线中文乱码怎么解决| 国产理论片| BBW老熟女BBw| 亚洲精品无码人妻| 欧美成人无码一区二区三区 | 日韩性爱一区| 北条麻妃无码播放| 国产性爱精品影片免费看| 国产精品中文字幕在线观看 | 日韩xxx视频| 亚洲成人综合网站| 午夜精品秘一区二区三区| 成人国产片| 成人欧美在线观看| 操嫩逼| 日本在线视频不卡| 亚洲a级| 欧美精品久久久| 操逼视频下载| 色婷婷AV一区二区三区之e本道 | 亚洲成人77777| 成人午夜福利视频| 国产精品成人视频| 国产无码午夜| 一区二区三区无码免费| 日本女优婷婷青青草原| 亚洲射色| 欧一美一婬一伦一区二区三区黑人| 手机看片久草| 国产女人18毛片水真多成人如厕| 尻屄视频在线观看| 苏妲己一级婬片A片| 91精品人妻少妇无码影院| www99热| 国产精品v欧美精品v日韩精品| 乱伦无码视频| 香蕉av在线观看| 欧美精品乱码99久久蜜桃| 色色欧美| 婷婷五月天免费视频| 大地99中文在线观看| 日逼网址| 亚洲免费黄色片| 中文字幕无码Av在线看| 国产激情内射| 翔田千里無碼破解| 国产免费黄色| 三级黄片网站| 日本黄色视频免费观看| 黄色性爱网址| 奇米狠狠操| 亚洲天堂人妻少妇| 你懂的视频在线播放| 欧美精品99久久久| av天堂中文| 国产精品久久久久久久久久九秃 | 中文字幕人妻一区| 日韩七区| 一区二区三区四区视频在线| 强波多野结衣黑人| 亚洲AV综合网| 成人无码免费毛片A片| 91影音先锋| www.91麻豆| 久久久久久无码精品亚洲日韩麻豆| 成人大香蕉网| 先锋影音一区二区三区| 免费看黄色的视频| 91青青草| 久久久久久久网| 亚洲成人高清无码| 一区四区视频| 成人伊人大香蕉| 欧美日韩国产在线| 99久| 国产女人18毛片水真多18| 中文电视剧字幕在线播放免费视频| 三级免费无限AV| 成人亚洲欧美| 中文字幕精品无码亚| 青娱乐精品在线视频| 国产乱码一区二区三区的解决方法 | 影音先锋色站| 无码人妻精品一区二区三区蜜桃91| 国产浮力草草| 激情人妻av| 懂色av粉嫩AV蜜臀AV| 影音先锋国产av| 欧美成人视频18| 操逼视频网站免费观看| 搡BBB,搡BBBB,搡BBBB| 美日韩AV| 日日干日日操| 欧美人成人无码| 久操综合| 久久肏逼| 99这里只有精品| 中文字幕五码| 天天日天天草| 欧美888| 亚洲高清无码免费| 在线天堂999| 99热大香蕉| 亚洲码成人| 日韩小视频| 三浦恵子一级婬片A片| 国产综合久久久777777| 69Av视频| 三级成人网站| 午夜AV福利| AV免费激情影院| 91人妻人人澡人人爽人妻| 欧美色性乐汇操日本娘们| 午夜福利视频网| 女人A片一级黄色| 最新无码在线| 99久久黄色| 五月中文字幕| 在线免费黄色网址| 国产偷拍网站| 伊人久久AV| 无码成人片| 欧美激情精品| 亚洲国产三级| 亚洲成人无码网站| 九九操比| 99久久99久久| 婷婷五月激情小说| 亚洲天堂视频在线| 国产一级二级三级久久久| 大地影院在线资源观看| 一区二区A片| 黄网站在线观看| 一道本无码在线观看| 狠狠干五月| 囯产精品久久久久久久| 免费的黄色片| 婷婷五月天综合网| 人人看人人插| 久久久一区二区三区四区免费听| 超碰成人AV| 国产无码在线影院| 亚洲中文婷婷| 日韩在线视频二区| 91视频久久| 国产草莓视频| 另类老妇性BBBWBBW| 中文字幕免费高清网站| 成人无码99| 国产精品美女毛片真酒店| 日本精品视频一区二区| 操逼一区| 亚洲黄色免费电影| 小黄片在线免费观看| 久久午夜无码鲁丝片| 无码人妻一区二区三区蜜桃视频 | 丰满人妻无码| 夜夜操夜夜撸| 免费小视频| 国产又粗又猛又爽又黄91精品 | 久久久黄色电影| 国产精品的电影| 强伦轩人妻一区二区三区四区| 69视频在线观看免费| 精品天堂| 黄色成人免费视频| 中文视频免费播放| 大香蕉伊人AV| 黄色大片免费网站| 国产三级片视频| 亚洲精品国偷拍自产在线观看蜜桃 | 激情麻豆论坛| 亚洲最新中文字幕| 潮喷AV| 日韩欧美在线播放| eeuss一区二区| 亚洲国产精| 日韩精品一区二区三区使用方法| 欧美啪啪网站| 精品国产乱子伦一区二区三区,小小扐 | 国产精品久久久久久久9999| 精品无套| 欧美视频第一页| 欧美18成人| 久久久成人电影| 三级自拍| 2026AV天堂网| 欧美无人区码suv| 激情亚洲婷婷| 免费看国产黄色| 亚洲国产三级| 精品探花| 欧美AAAAAAAAAA特级| 亚洲免费视频在线观看| 久久噜噜| 国产黄片在线视频| 日皮做爱视频网站| 2025天天干| 亚洲第一色婷婷| 色婷婷天天操天天干| 九色国产视频| 天天操欧美| 97男人的天堂| 特黄aaaaaaaa真人毛片| 国产无遮挡又黄又爽又色视频| 人妻丝袜蕾丝高跟双飞| 日韩无码性爱| 欧美午夜伦理| 欧美国产日韩视频| 亚洲高清在线视频| 欧美男人的天堂| 亚洲午夜久久| 日韩性爱视频| 男女啪啪网| 婷婷五月天啪啪| 色欧美亚洲| A片视频在线观看| 欧美日韩人妻| 国产av电影网| 欧美日韩中文字幕无码| 美女黄色免费网站| 国产精品国产三级国产AⅤ中文 | 欧美熟妇高潮流白浆| 国产一级a毛一级a毛片视频黑人| 91成人免费电影| 黄色a片视频| 日本成人免费电影| 日本一级a片| 91秦先生在线播放| 久久视频在线| 败火老熟女ThePorn视频| 熟女人妻人蜜桃视频| 无码123区| jzzijzzij亚洲成熟少妇在线观看| 高清无码一区| 色xxxx| 99热综合在线| 亚洲最新AV在线| 欧美日本国产| 黄a在线观看| 九九黄色| 囯产一级黄片| 国产精品999| 日韩免费无码视频| 2014av天堂网| 无码欧美人XXXXX日本无码| 成人黄色在线观看| 精品成人在线| 黄片视频免费播放| 亚洲视频A| 天天操天天操免费视频| 91精品视频在线播放| 自拍偷拍精品视频| 无码另类| 成人区色情综合小说| 超碰在线中文字幕| 天天日夜夜添| 日韩理论在线| 日韩黄色电影在线| 人人干人人看| 国产XXXXX| 国产毛片毛片毛片毛片毛片| 免费三级怡红院| 操b免费| 欧美激情一区| 成人视频免费| 超碰免费91| 色中色av| 成人乱码一区二区三区| 涩婷婷| 99精品免费| 西西人体44www大胆无码| 亚洲无吗视频| 免费的黄色A片| 国产成人精品一区二区| 大伊人久久| 人人妻人人澡人人爽人人爽| 91就去干| 安徽妇搡BBBB搡BBBB,另类老妇 | 欧美三级美国一级| 黄色片无码| 天天拍夜夜爽| 九七色色电影| 欧美性爱小说| 四川BBB搡BBB搡多人乱| 懂色AV一区二区三区国产中文在线 | 高清无码在线免费观看| 亚洲精品视频在线播放| 亚洲精品秘一区二区三小| 啊啊啊啊啊在线观看| 青青精品| 精品无套| 操嫩逼| 国产成人A| 久久综合五月天| 竹菊传媒一区二区三区| 欧美操美女| 国产精品无码永久免费A片| 影音先锋成人在线| 国产毛片在线看| 亚洲三级黄色视频| 国产乱子伦一区二区三区在线观看| 欧洲a视频| 欧美成人一区二区三区片| 婷婷色网| 久久五月婷| 91香蕉麻豆| 9999国产精品| 玖玖激情| 激情五月天综合网| 国产精品99久久免费黑人人妻| av福利电影在线| 91成人影片| 青青草精品视频| 国产精品93333333| 欧美日韩高清一区二区三区| 国产资源AV| 强奸五月天| 91人兽| 国产无套在线观看| 日本18禁网站| 欧美精品在线视频| 成人亚洲视频| 久久一卡二卡| 亚洲第一无码| 亚洲AV无码乱码国产精品黑人| 午夜理论在线| 无码人妻精品一区二区50| 亚洲情免| 大香蕉精品在线| 亚洲色五月| 日韩一级在线播放| 日韩A片免费看| 少妇厨房愉情理伦BD在线观看| 91国产精品在线| 米奇色色色| 日本少妇bbw| 麻豆蜜桃wwww精品无码| 久久天天| 精品人妻中文字幕| 狼友视频在线播放| 99无码国产成人精品| 久久极品| 日韩无码123| 日日搔AV一区二区三区| 欧美色色综合| 日本黄色大片网站| 人人操人人爱人人摸| 成人国产片女人爽到高潮| 亚洲黄色电影| 欧美另类色图| 久久久毛片| 在线观看者亚洲| 亚洲另类色图| 婷婷综合五月天| 亚洲无套内射| 伊人精品A片一区二区三区| 一本色道久久无码人妻精品69| 久久精品人人| 玩弄大荫蒂视频| 视频一区在线播放| AV在线播放中文字幕| A级毛片网站| 丝袜内射| 国产AV高清| 色77777| 亚洲国产91| 日韩一级特黄A片免费观| 嫩BBB搡BBB槡BBB小号| 午夜欧美| 无码777| 99久在线精品99re8| 精品国产午夜福利在线观看 | 黄色一级片视频| 亚洲中文字幕视频在线观看| 国产精品夜夜爽7777777| 操逼啦| 欧美一级黄色大片| 熟妇女人妻丰满少妇中文字幕 | 99在线精品视频免费观看软件| HEZ-502搭讪绝品人妻系列| 狠狠操狠狠操狠狠操| www男人天堂| 亚洲视频一区二区三区四区娇小视频在线观看视频| www.日批| 亚洲视频欧美| 日韩无码成人片| 亚洲AV综合网| 亚洲一区二区三区在线视频| 日韩A片在线| 色噜噜一区二区三区| 国产手机拍视频推荐2023| 在线视频你懂| 欧美888| 一区二区三区在线观看免费| chinese搡老熟老妇人| 亚洲第一综合| 中文字幕日韩亚洲| 免费黄色视频网站大全| 亚洲先锋影音| 日本理论片一道本| 污视频网站在线观看| 影音先锋乱伦| 亚洲婷婷网| 国产乱码一区二区三区的区别| 欧美伊人在线| 日韩在线视频免费播放| 老熟女91| 在线观看的av网站| 深爱激情网五月天| 欧美激情片| 北条麻妃在线一区| 亚洲美女一区| 成人精品无码免费视频| 国产成人视频免费观看| 国产综合久久777777麻豆| 欧美大香蕉在线视频| 图片区小说区区亚洲五月| 四虎黄色网址| 日本中文字幕电影| 欧美a视频| 黄色免费网站在线观看| 岛国AV在线| 亚洲视频免费在线观看| 92午夜福利天堂视频2019| 北条麻妃在线观看香蕉| 欧美成人网站视频| 亚洲午夜精品久久久久久APP| 日韩av中文字幕在线播放| 在线免费观看国产视频| 特黄一级A片| 男女一区二区三区| ThePorn精品无码| 午夜ww| 国产69久久精品成人看| 人人超碰人人| 乱子伦国产精品www| 美女免费网站| 成人精品毛片| 黄色小网站在线观看| 青青草无码| 少妇搡BBBB搡BBBB毛多多| 中文字幕有码在线| av在线资源| 免费中文字幕| 99久久久国产精品免费蜜臀| 麻豆传媒一区| 欧美日韩a片| 精品免费在线| 精品成人在线视频| 久久理论| 91视频国产精品| 人人艹人人干| 成人黄色一级片| 九九在线视频| 国产精品久久久久久久久久| 亚洲影院中文字幕| 亚洲情在线| av一区在线| 欧美激情国产精品| 国产不卡一| 高清无码视频18| 无码黄片免费| 亚洲av在线免费观看| 插菊综合网| 操骚逼视频| AV影院在线| 天天夜夜狠狠| 无码人妻AV一区| 9l视频自拍九色9l视频成人| wwwsesese| 乱子伦国产精品视频| 欧美日韩成人在线视频| 91成人电影在线观看| 成人视频网站18| 亚洲色777| 亚洲黄色av网站| 超碰碰97| yw视频在线观看| JULIA超乳JULIA无码| 国产17c精品视频一二三区| 国产一区二区AV| 99精品视频在线| 亚洲伊人av| 免费高清无码在线| 免费视频亚洲| 美日韩一区二区三区| A片视频免费观看| 操屄免费视频| 精品欧美无人区乱码毛片| 骚白虎一区| 久久婷婷青青| 欧美精品黄| 国产美女AV| ppypp电影频道| 人成在线免费视频| 国产在线小视频| 91丨豆花丨成人熟女| 国产Av资源| 午夜福利视频3000| 精品成人视频| 日韩免费三级片| 色婷婷成人做爰A片免费看网站| 木下凛凛子AV888AV在线观看| 中文字幕自拍偷拍| 欧美色影院| 国产一区二区电影| 久久aa| 狠狠操综合网| 少妇人妻偷人精品无码视频新浪| 国产99999| 999热视频| 欧美操逼网址| 人人操大香蕉| 青春草在线观看| www.色在线观看| 99久久人妻无码中文字幕系列| 午夜天堂精品久久久| 中文字幕av久久爽Av| 瑟瑟视频在线观看| 久久电影五月天| 久久久无码电影| 韩国成人精品三级| 久久第一页| 天干天干天夜夜爽| 国产高清视频| 人人肏人人射| 青娱乐| 日韩欧美视频在线| 国产成人99久久亚洲综合精品| 加勒比DVD手机在线播放观看视频 日韩精品一区二区三区四区蜜桃视频 | 免费高清无码在线观看| 国产综合自拍| 亚洲视频三区| 亚洲AV无码成人精品区久| 人人看人人摸人人搞| 日皮视频免费| 国产一级A片| 欧美三级不卡| 又色又爽| 粉嫩av懂色av蜜臀av分享| 在线中文字幕网站| 国产人与禽zoz0性伦| 午夜美女福利视频| 午夜福利视频91| 中文字幕无码Av在线看| 小日本91在线观看| 99视频自拍| 亚洲无码AV网站| 国产黄色精品视频| 国产小视频在线| 一区二区三区小视频| 少妇精品久久久久久久久久| 伊人小视频| 操操操操操| 人人插人人澡| 老太老熟女城中层露脸60| 亚洲无码高清视频在线| 亚洲天堂在线视频观看| 久草资源视频| 四季AV之日韩人妻无码| 青春草在线观看国产| www99热| 91九色精品女同系列| 天堂在线8| wwwxxx18| 亚洲无码自拍| 麻酥酥在线视频| 免费二区| 91探花视频精选在线播放| 神马午夜av| 在线播放91灌醉迷J高跟美女| 国产精品无码ThePorn| 黄色无码网站| 69视频在线免费观看| 久久人人操人人| 人人综合| 久久偷拍视频| 五月丁香婷婷在线观看| 永久免费黄色视频| 国精产品一区二区三区黑人和中国| 国产婷婷色一区二区| 天天草天天草| 日本精品中文字幕| 无码日韩精品一区二区免费96| 久久露脸国语精品国产91| 三级网站网址| 天天爽天天爽| 日本黄色视频官网| 中文字幕少妇| 欧美成人版| 午夜亚洲国产一区视频网站| 国产欧美日韩综合在线视频| 一级性爱| 国产AV激情| 一区二区三区四区在线视频| 俺去啦俺来也| 91视频播放| 国产成人午夜福利视频| 青青在线免费视频| 天天撸在线视频| 激情中文网| 日韩久久中文字幕| 黄片视频网站| 高清的日逼| 你懂的视频在线播放| 51妺嘿嘿午夜福利| 日韩操大屌| 天干天干天夜夜| 国产XXXXX| 丁香婷婷久久久综合精品国产| 91麻豆精品在线观看| 国产精品国产精品国产专区不卡 | 最近中文字幕在线视频| 久久婷综合| 国产综合精品久久久久成人AV| 正在播放吴梦梦淫行| 在线黄色视频网站| 日本在线小视频| 欧美级毛片高潮| 欧美一区免费| 亚洲无码制服| 中文字字幕中文字幕乱码| 亚洲第一中文字幕| 俺去啦在线| 松岛枫在线视频| 久久久久99精品成人片三人毛片| 中文字幕亚洲日韩| 中文av网站| 欧美一级久久| 超碰在线观看97| av一区在线| 一级片久久| 免费一级无码婬片A片AAA毛片 | 鲁一鲁在线视频| 无码人妻精品一区二区三千菊电影| 色就是色欧美成人网| 午夜福利澳| 九九热精品视频在线观看| 国产伊人自拍| 91国内偷拍| 一区二区亚洲| 亚洲色图88| 亚洲天堂成人网| 九九九在线观看视频| 熟妇熟女一区二区三区| 无码人妻一区二区三区| 亚洲黄色av网站| 国产黄色性爱视频| www.99热| 在线国产日韩| A级无码| 色噜噜一区二区| 中文字幕乱码中文字幕电视剧| 91就要爱爱视频|