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

前端如何進行單文件上傳云服務存儲

開發 前端
不知道大家日常使用的上傳方式是否和我們團隊一致,之前上傳文件方案中,我司后端團隊會提供一個后端上傳服務接口,前端直接使用這個接口進行文件上傳,后端接受到完整文件后,會再通過調用云文件服務提供的后端 Java SDK 進行文件上傳。

前端如何進行單文件上傳云服務存儲

http://zoo.zhengcaiyun.cn/blog/article/cloudservicestorage

在日常的開發過程中,我相信大家肯定會碰到很多的文件上傳需求,例如流程中的附件,設置頭像圖片等等內容,并且上傳的文件,為了前端頁面的加載性能,一般也都會選擇將文件上傳至云服務存儲當中去,之后直接使用文件的 cdn 路徑來訪問。那么問題來了,對于文件如何上傳到云服務存儲當中去大家是否了解呢?上傳流程有遇到什么困難嗎,所以這篇文章也借著我們團隊遇到的一些問題,跟大家交流一下云服務文件存儲當中的一些問題與解決方式。

目前常用的上傳方式

后端上傳

不知道大家日常使用的上傳方式是否和我們團隊一致,之前上傳文件方案中,我司后端團隊會提供一個后端上傳服務接口,前端直接使用這個接口進行文件上傳,后端接受到完整文件后,會再通過調用云文件服務提供的后端 Java SDK 進行文件上傳

圖片

這個方案的優缺點

優點:前端所有使用的上傳接口統一,前端統一對接公司內部的上傳服務,后端上傳服務再去對接各個不同的云存儲服務廠家,保證文件上傳

缺點:后端服務需要接受所有的文件上傳的流量,然后再次進行上傳,服務器壓力比較大。

基于上面提到的缺點,在經歷過服務器壓力過大,導致幾次大文件上傳失敗、各種外地網絡延遲導致超時故障之后,痛定思痛,決定要重新調整上傳的方式。

前端上傳

既然后端服務上傳需要走流程傳輸導致資源壓力過大,那是否可以可以將壓力轉移到用戶側,使用用戶的瀏覽器直連云存儲服務進行上傳呢?答案是當然可以,不然也就沒有本文了。

在翻閱了幾個不同的云服務的上傳文檔后發現,目前主流常用的前端上傳方案會分為兩種方式:

  1. 前端調用各大云服務的 JavaScript SDK 進行上傳
  1. 優點:無需后端服務介入,直接調用各個云服務 SDK 方法使用即可
  2. 缺點:前端需要獲取各個云服務的 AK (AccessKey ID),SK (AccessKey Secret) 等賬號信息,并且會暴漏在代碼中,并且各個云服務場景會有對應的 SDK 以及調用方式,全部做了集成的話,包的體積可能不可控,并且有些云服務商,沒有提供前端使用的SDK。
  1. 云服務會提供臨時授權的 URL,前端可以直接通過這個授權 URL 訪問云服務,進行文件上傳
  2. 優點:前端不需要獲取云服務的 AK (AccessKey ID),SK (AccessKey Secret) 信息,統一由后端接口提供對應上傳所需的請求地址,數據格式即可,前端通過一個接口獲取這些信息后,調用上傳即可

  3. 缺點:各家云服務上傳所需的數據格式都不相同,前端需要調研,解析這個數據格式

上傳示例

下面以大家常用的阿里云舉例

SDK上傳

webpack打包類型項目,可以先通過 npm install ali-oss 安裝 SDK,以下為上傳數據到 examplebucket 中 exampledir 目錄下的exampleobject.txt 文件的代碼示例

const OSS = require('ali-oss');

const client = new OSS({
  // 以下為初始化參數
  region: 'yourRegion',
  // 從 STS 服務獲取的臨時訪問密鑰(AccessKey ID和AccessKey Secret)。
  accessKeyId: 'yourAccessKeyId',
  accessKeySecret: 'yourAccessKeySecret',
  // 從STS服務獲取的安全令牌(SecurityToken)。
  stsToken: 'yourSecurityToken',
  // 填寫 Bucket 名稱(可以簡單理解為,你上傳不同文件到不同的文件夾命名)。
  bucket: 'examplebucket'
});
// 從輸入框獲取 file 對象,例如 <input type="file" id="file" />。
let data;
// 創建并填寫 Blob 數據。
//const data = new Blob(['Hello OSS']);
// 創建并填寫 OSS Buffer內容。
//const data = new OSS.Buffer(['Hello OSS']);
const upload = document.getElementById("upload");
const headers = {
  // 以下為上傳時可以設置的一些 header 數據,不同云服務需要的不同,具體參考各個版本文檔
  // 'Content-Type': 'text/html', // 指定上傳文件的類型。
  // 'Cache-Control': 'no-cache',  // 指定該 Object 被下載時網頁的緩存行為。
  // 'Content-Disposition': 'oss_download.txt',  // 指定該 Object 被下載時的名稱。
  // 'Content-Encoding': 'UTF-8',  // 指定該 Object 被下載時的內容編碼格式。
  // 'Expires': 'Wed, 08 Jul 2022 16:57:01 GMT',  // 指定過期時間。
  // 'x-oss-storage-class': 'Standard',  // 指定 Object 的存儲類型。
  // 'x-oss-object-acl': 'private',  // 指定 Object 的訪問權限。
};
async function putObject(data) {
  try {
    // 填寫Object完整路徑。Object 完整路徑中不能包含 Bucket 名稱。
    // 您可以通過自定義文件名(例如 exampleobject.txt )或文件完整路徑(例如 exampledir/exampleobject.txt )的形式實現將數據上傳到當前 Bucket 或 Bucket 中的指定目錄。
    // data 對象可以自定義為 file 對象、Blob 數據或者 OSS Buffer。
    const result = await client.put(
      "exampledir/exampleobject.txt",
      data
      //{headers}
    );
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}
upload.addEventListener("click", () => {
  data = document.getElementById("file").files[0];
  putObject(data);
});

直接調用 SDK 中提供的 put 等方法即可完成文件上傳

臨時 URL 上傳(STS 臨時授權)

鑒于 SDK 上傳方案中,會在代碼中暴漏 AK (AccessKey ID),SK (AccessKey Secret)  等云服務數據,所以云服務廠家一般也會提供生成臨時令牌的方式,可以由后端服務生成一個自定義時效以及權限的訪問憑證提供給前端進行上傳,有效期到期后,這個訪問令牌就會失效,保證了前端上傳的安全性。

圖片

1. 客戶端向自己的后端應用發起請求,將文件類型,名稱信息等傳給后端,獲取對應的上傳信息以及授權簽名信息 signature 等,

const UploadParams = {
  "accessid":"LTAI5tBDFVar1hoq****",
  "host":"http://post-test.oss-cn-hangzhou.aliyuncs.com",
  "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8i****",
  "signature":"VsxOcOudx******z93CLaXPz+4s=",
  "expire":1446727949,
  "dir":"user-dirs/"
}

2. 在獲取到服務器返回的簽名信息等內容后,客戶端則可以通過 POST 或者 PUT 請求直接向云服務發送上傳文件的請求(上傳形式多種多樣,并且有些云服務有要求上傳數據類型為 form-data 格式)

// form-data 類型
let params = {
   // key表示上傳到 Bucket 內的 Object 的完整路徑,例如 exampledir/exampleobject.txtObject,完整路徑中不能包含 Bucket 名稱。
   // filename 表示待上傳的本地文件名稱。
   'key' : key + '${filename}',
   'policy': UploadParams.policy,
   'OSSAccessKeyId': UploadParams.accessid,
   // 設置服務端返回狀態碼為200,不設置則默認返回狀態碼204。
   'success_action_status' : '200',    
   'signature': UploadParams.signature,
}
let requestData = new FormData();

Object.keys(params).map(key => {
  requestData.append(key, params[key]);
});
// 獲取的上傳 file 文件,file 必須為最后一個表單域,除 file 以外的其他表單域無順序要求
requestData.append('file', fileObj);

// 非 form-data 類型(非阿里云云服務會遇到,以下代碼僅舉例,不代表真實使用場景)
let requestData = fileObj;
let headers = {
   'key' : key + '${filename}',
   'policy': UploadParams.policy,
   'OSSAccessKeyId': UploadParams.accessid,
   'success_action_status' : '200',    
   'signature': UploadParams.signature,
}

// 進行接口請求,上傳文件
axios({
  method: 'post',
  url: params.host,
  data: requestData,
  headers: headers || {},
});

這里代碼只是簡單的示例,實際使用時需要對各個文件服務需要進行不同的適配。

加密算法和解析

對于獲取 Signature 鑒權信息等內容時,后端服務在有文檔或者 SDK 時,可以對接不同的云服務 JAVA SDK 直接進行生成臨時授權的信息,在沒有文檔的情況下,則需要前端或者后端,針對各個不同的云服務,進行解析加密 Signature 的步驟(我司這里是前端進行了加密過程解析后,后續日常生成由后端服務完成)。

加密算法

此處我以紫光云的 Signature 生成步驟給大家簡單介紹下加密算法的流程,不同的云服務,加密過程都比較類似。

圖片

圖片來源:紫光云上傳流程(https://www.unicloud.com/document/show-19262078.html)

以下是根據上述的加密流程寫的測試生成 Signature 的代碼部分,大家也可以自行測試試用。

按流程主要分成3步即可

  1. 生成 CanonicalRequest 字段
  2. 生成前面的 StringToSign
  3. 根據 AK (AccessKey ID),SK (AccessKey Secret)  生成 Signature,最后組裝 Authorization。
const crypto = require('crypto');
const CryptoJS = require('crypto-js')

function zip() {
  const filename = 'uploadTest.png'
  // const date = new Date()
  // const timeStampISO8601Format = `${date.toISOString().replace(/-/g, '').replace(/:/g, '').split('.')[0]}Z` // ISO 8601 格式
  const timeStampISO8601Format = '20230101T000000Z' // ISO 8601 格式
  const dateString = timeStampISO8601Format.substr(0, 8) // YYYYMMDD 格式時間

  const uriFileName = uriEscapePath(filename)
  const content = 'UNSIGNED-PAYLOAD'
  
  // 生成 CanonicalRequest 字段
  let CanonicalRequest = `PUT\n${uriFileName}\n\ncontent-disposition:attachment;filename=uploadTest.png\ncontent-type:image/png\nhost:oos-cn.ctyunapi.cn\nx-amz-content-sha256:${content}\nx-amz-date:${timeStampISO8601Format}\n\ncontent-disposition;content-type;host;x-amz-content-sha256;x-amz-date\n${content}`
  let hashedCanonicalRequest = crypto.createHash('sha256').update(CanonicalRequest).digest('hex');

  // 生成前面的 StringToSign
  const signStr = `AWS4-HMAC-SHA256\n${timeStampISO8601Format}\n${dateString}/cn/s3/aws4_request\n${hashedCanonicalRequest}`
  //根據 AK (AccessKey ID),SK (AccessKey Secret) 生成 Signature
  const AWSAccessKeyId = 'AWSAccessKeyId';
  const AWSSecretAccessKey = 'AWSSecretAccessKey';

  var DateKey = CryptoJS.HmacSHA256(dateString, `AWS4${AWSSecretAccessKey}`);
  var DateRegionKey = CryptoJS.HmacSHA256('cn', DateKey);
  var DateRegionServiceKey = CryptoJS.HmacSHA256('s3', DateRegionKey);
  var SigningKey = CryptoJS.HmacSHA256('aws4_request', DateRegionServiceKey);
  var Signature = CryptoJS.HmacSHA256(signStr, SigningKey);
  console.log('?? ~ Signature==', `${Signature}`);

  // 最后上傳需要的 Authorization 數據
  let Authorization = `AWS4-HMAC-SHA256 Credential=${AWSAccessKeyId}/${dateString}/cn/s3/aws4_request, SignedHeaders=content-disposition;content-type;host;x-amz-content-sha256;x-amz-date, Signature=${Signature}`
  console.log('?? ~ Authorizatinotallow==', Authorization)
}

try {
  zip()
} catch (error) {
  console.log('?? ~ error', error)
}

// uriEncode 方法
function uriEscapePath(string) {
  var parts = [];
  arrayEach(string.split("/"), function (part) {
    parts.push(uriEscape(part));
  });
  return parts.join("/");
}

function uriEscape(string) {
  var output = encodeURIComponent(string);
  output = output.replace(/[^A-Za-z0-9_.~\-%]+/g, escape);
  output = output.replace(/[*]/g, function (ch) {
    return "%" + ch.charCodeAt(0).toString(16).toUpperCase();
  });
  return output;
}

function arrayEach(array, iterFunction) {
  for (var idx in array) {
    if (Object.prototype.hasOwnProperty.call(array, idx)) {
      var ret = iterFunction.call(this, array[idx], parseInt(idx, 10));
      if (ret === {}) break;
    }
  }
}

常用云服務上傳格式 下面也提供了一些常用云服務上傳格式,上傳需要的最基礎格式,按照這個格式,組裝出需要的數據,然后發起上傳請求即可。下文示例中,如果使用 data 數據類型來進行校驗權限,上傳基本都是采用 form-data 數據封裝,上傳的 File 文件。而如果使用的是 headers 的類型進行數據校驗,上傳的 File 文件直接賦值請求中的 data 字段即可。

阿里云

{
  "method":"POST", // 上傳的請求類型
  "dataType":"formData", // 為了區分上傳數據的 form-data 類型,可自己任意定義
  "data":{ //
      "OSSAccessKeyId":"accessKeyId",
      "signature":"計算后簽名Signature",
      "success_action_status":"200",
      "Content-Disposition":"attachment;filename=encodeURI(filename)",
      "key":"上傳文件路徑/上傳的文件fileId",
      "policy":"后端返回的policy",
      "file": File, // 上傳的 file 文件
  },
  "action":"上傳服務的域名" // 前端發起上傳的請求 URL
}

華為云

{
  "headers":{
    "X-Requested-With":null,
    "Content-Disposition":"attachment;filename=encodeURI(filename)",
    "Content-Type":"文件類型"
  },
  "method":"PUT",
  "data": File, // 上傳的 file 文件
  "dataType":"text",// 為了區分上傳數據的 form-data 類型,可自己任意定義
  "action":"https://上傳服務url域名/bucket/${fileId}?AccessKeyId=${AccessKeyId}&Expires=${過期時間}&Signature=${計算后簽名Signature}",
  "fileId":"文件名稱,可以使用唯一id"
}

電信云 / 紫光云

{
  "headers":{
    "Authorization":"AWS4-HMAC-SHA256 Credential=<your-access-key-id>/<date>/<aws-region>/<aws-service>/aws4_request , SignedHeaders=content-disposition;content-type;host;x-amz-content-sha256;x-amz-date, Signature=${計算后前面Signature}",
    "x-amz-content-sha256":"UNSIGNED-PAYLOAD",
    "x-amz-date":"20230202T093208Z(服務器時間)",
    "Content-Disposition":"attachment;filename=encodeURI(fileName)",
    "Content-Type":"文件類型"
  },
  "method":"PUT",
  "data": File, // 上傳的 file 文件
  "dataType":"text",
  "action":"https://上傳服務url域名/bucket/${fileId}"
}

從這幾種云服務的類型可以看出,上傳參數區分,基本分為了data 數據校驗上傳或者 headers 校驗上傳,上面的文件上傳實例代碼基本可以包括目前的幾種上傳請求方式

上傳推薦

以上兩種方式都可以滿足前端直連上傳的需求,大家選擇的時候可以根據自己的實際場景進行選擇即可。

當你的上傳云服務比較單一,無論是 SDK 上傳,或者臨時授權 URL 上傳都可以選擇,不過如果對賬號安全比較敏感,第一種方式也可以選擇加密或者配置數據的方式進行賬號的傳遞。

而鑒于我司有多種云服務上傳的需求,并且 SDK 上傳方式需要暴漏 AK (AccessKey ID),SK (AccessKey Secret) 等業務數據, SDK 的集成也會使后續輸出的 NPM 包依賴內容過大,還需要兼容不同 SDK不同的上傳調用方法,所以我司最后是選擇了臨時授權 URL 的方式進行處理,一方面,服務商敏感數據可以放在后端服務進行統一維護處理,另一方面,前端對于不同云服務上傳的配置數據進行統一的兼容處理,在發起后續的上傳,代碼邏輯也會比較的統一。

總結

本文僅針對了單文件上傳進行了梳理,對于多文件、分片上傳等還未涉及,后續還會繼續分享。不知道大家對于對接云服務上傳是否還有其他更好的處理方式,歡迎一起討論一下。

參考鏈接

阿里云 SDK 上傳(https://help.aliyun.com/document_detail/383950.html)

阿里云 PostObject 解析(https://help.aliyun.com/document_detail/31988.htm?spm=a2c4g.11186623.0.0.160750c5esmHVG#section-d5z-1ww-wdb)

阿里云后端簽名后直傳(https://help.aliyun.com/document_detail/31926.html)

華為云臨時授權 url 訪問(https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0801.html)

電信云鑒權加密方式(https://www.ctyun.cn/document/10026693/10027129)

紫光云鑒權加密方式(https://www.unicloud.com/document/show-19262078.html)

圖片

責任編輯:武曉燕 來源: 政采云技術
相關推薦

2022-10-10 09:11:12

互聯網存儲系統云計算

2021-12-14 22:12:30

云計算云存儲IT

2023-03-24 16:18:08

微服務架構

2011-10-26 11:21:47

服務器虛擬化存儲管理

2022-03-14 18:29:34

云合規監控云平臺

2011-07-04 10:20:25

服務器云時代

2012-10-15 09:30:04

CSSDIVWeb

2010-01-27 10:45:21

C++單例模式

2010-03-09 18:14:55

Python sock

2011-09-01 18:54:29

WifiGoodReader

2010-02-02 13:04:03

C++頭文件

2010-07-22 16:13:53

2022-05-25 15:33:27

區塊鏈加密貨幣

2019-04-18 10:20:44

2011-07-25 10:48:34

服務器虛擬服務器

2016-12-12 16:17:22

華為

2015-09-11 09:39:51

云計算

2022-03-24 13:55:37

云計算合規性監控工具

2010-03-12 19:29:15

python svn腳

2010-08-05 09:46:45

FlexAIR文件打包
點贊
收藏

51CTO技術棧公眾號

av免费播放网站| 手机在线免费观看毛片| 人妻与黑人一区二区三区| 欧美日韩免费观看一区=区三区| 精品久久人人做人人爱| 韩国日本在线视频| 国产精品久久麻豆| 成人小视频免费观看| 国产精品国产福利国产秒拍| 少妇影院在线观看| 免费av一区二区三区四区| 这里只有精品免费| 夫妻免费无码v看片| 精品孕妇一区二区三区| 波多野结衣在线一区| 国产中文欧美精品| 日本a级c片免费看三区| 欧美日韩三级电影在线| 中文字幕在线亚洲| 少妇特黄一区二区三区| 免费看日产一区二区三区| 欧美在线999| 黄色一级在线视频| 日本动漫同人动漫在线观看| 国产精品午夜在线| 久久久久久国产精品mv| 亚洲欧美激情国产综合久久久| 蜜桃视频在线观看一区| 91精品国产91久久久久久吃药| 视频国产一区二区| 精品国产乱码久久久| 亚洲第一免费网站| 日本黄色www| 日韩精品一级毛片在线播放| 一本一本久久a久久精品综合麻豆| 又大又硬又爽免费视频| 久草资源在线| 国产精品毛片久久久久久| 欧美高清一区二区| 天堂中文在线官网| 国产不卡免费视频| 91精品天堂| 国产强伦人妻毛片| 蜜臀av性久久久久蜜臀aⅴ| 欧美在线视频导航| 免费黄色网址在线| 国产精品乱看| 欧美亚洲伦理www| 99久在线精品99re8热| 日韩香蕉视频| 97高清免费视频| 日韩精品久久久久久久| 亚洲精品人人| 久久国产色av| 亚洲欧美另类久久久精品| av资源网在线播放| 开心激情五月网| 亚洲高清在线观看一区| 日韩精品久久久久久久玫瑰园| 豆国产96在线|亚洲| 噜噜噜天天躁狠狠躁夜夜精品| 日韩在线视频一区二区三区 | 久久av一区二区三| 成人污版视频| 欧美一区二区美女| 不卡的一区二区| gogo久久日韩裸体艺术| 欧美精品一区二区不卡| 人妖粗暴刺激videos呻吟| 久久精品论坛| 亚洲人线精品午夜| 任我爽在线视频| 中文字幕一区二区三区欧美日韩| 久久视频这里只有精品| 久草视频免费在线| 亚洲视频综合| 国产成人欧美在线观看| 一级特黄aa大片| 国产精品自拍毛片| 国产一区在线免费| 高清美女视频一区| 亚洲伦理在线精品| 大陆极品少妇内射aaaaa| 久久久一本精品| 欧美福利电影网| 亚洲成年人av| 国产精品免费99久久久| 久久这里有精品视频| 日韩免费av片| 免费精品视频在线| 国产乱码精品一区二区三区中文| 欧洲一级在线观看| 亚洲欧美偷拍三级| 97av视频在线观看| 欧美精品影院| 精品亚洲一区二区| 顶臀精品视频www| 亚洲欧美久久| 91福利视频导航| 欧洲综合视频| 夜夜操天天操亚洲| 日日噜噜夜夜狠狠| 精品视频高潮| 精品国产视频在线| 精品国产一区二区三区四| 国产一区二区三区av电影| 免费观看成人高| 91高清在线观看视频| 91久久国产综合久久| 精人妻一区二区三区| 久久电影院7| 欧美一级淫片播放口| 精品人妻少妇嫩草av无码专区| 久久亚洲一区二区三区明星换脸| 在线观看污视频| 国产精成人品2018| 亚洲人成在线一二| 国产一级片免费| 国产综合色产在线精品| 日本一区高清在线视频| 黄色成人在线网| 88在线观看91蜜桃国自产| 亚洲黄色小说视频| 亚洲一区二区三区免费在线观看 | 伊人网免费视频| av电影在线观看一区| 成人短视频在线观看免费| 国产成人亚洲一区二区三区| 日韩av在线看| 五月天婷婷网站| 国产很黄免费观看久久| 在线天堂一区av电影| 欧美与亚洲与日本直播| 亚洲色图国产精品| 国产又爽又黄的视频| 成人美女视频在线观看| 永久免费看av| 狂野欧美xxxx韩国少妇| 啊v视频在线一区二区三区| 国产成人精品亚洲| 欧美日韩精品免费观看视完整| 色美美综合视频| 野外性满足hd| 免费永久网站黄欧美| 久久国产精品高清| 中文字幕在线看片| 亚洲精品永久免费| 国产性生活视频| 久久欧美中文字幕| 99精品视频在线看| 丝袜久久网站| 国产成人精品视频在线| 成人影院免费观看| 欧美中文字幕久久| 日本午夜精品视频| 美国三级日本三级久久99| 五月天亚洲综合情| 91久久久久久白丝白浆欲热蜜臀| 中文字幕亚洲欧美一区二区三区| 中文无码精品一区二区三区| 国产精品久久久久aaaa| 久久久久xxxx| 欧美日韩国产一区精品一区| 国产日韩亚洲精品| 国产直播在线| 国产性猛交xxxx免费看久久| 亚洲天堂男人网| 亚洲欧美国产三级| 中国特级黄色大片| 免费在线播放第一区高清av| 日韩欧美在线观看强乱免费| 久久人体av| 九九热这里只有精品免费看| 亚洲欧美激情国产综合久久久| 五月婷婷久久丁香| 手机免费看av| 狠狠狠色丁香婷婷综合久久五月| 大片在线观看网站免费收看| 欧美亚洲国产日韩| 国产精品午夜视频| av在线免费网址| 亚洲精品久久在线| 中文字幕免费在线看| 亚洲乱码一区二区三区在线观看| 一本色道久久hezyo无码| 欧美亚洲免费| 裸体大乳女做爰69| 奇米影视777在线欧美电影观看| 国产精品久久精品| 在线观看男女av免费网址| 亚洲国产精品久久久| 久久这里只有精品9| 亚洲精品ww久久久久久p站| 一级国产黄色片| 老司机免费视频一区二区| 日韩网站在线免费观看| 青青草成人影院| 国产精品区一区二区三在线播放| 午夜精品成人av| 九九热r在线视频精品| 麻豆导航在线观看| 日韩精品一区二区三区中文精品| 亚洲av人无码激艳猛片服务器| 夜夜嗨av一区二区三区网页| 一区二区三区在线观看免费视频| 高潮精品一区videoshd| 日本久久久久久久久久久久| 亚洲精品极品| 麻豆传媒网站在线观看| 国产精品免费大片| 国产精品免费一区二区三区在线观看 | 亚洲黄色a级片| 在线观看成人小视频| 国产精久久久久久| 亚洲视频免费看| 日韩视频在线观看免费视频| 99精品视频在线观看免费| 91丝袜超薄交口足| 日本91福利区| 苍井空浴缸大战猛男120分钟| 国语精品一区| 国产免费xxx| 国产精品毛片久久| 日韩av影视| 亚洲免费成人av在线| 成人自拍视频网站| 成人97精品毛片免费看| 国产精品视频精品| 日韩欧美一区二区三区免费观看| 97国产精品视频人人做人人爱| 日本小视频在线免费观看| 色偷偷88888欧美精品久久久| 精品久久av| 亚洲美女av在线播放| 人人妻人人澡人人爽久久av| 欧美成人午夜电影| 成人av手机在线| 日韩欧美国产一区二区在线播放| 国产一区二区在线播放视频| 欧美色视频一区| 成人免费一区二区三区| 色8久久精品久久久久久蜜| 99热在线观看免费精品| 午夜精品成人在线视频| 日韩精品久久久久久久| 婷婷丁香久久五月婷婷| 日本在线观看中文字幕| 亚洲福利视频三区| 日韩欧美中文字幕一区二区| 午夜精品成人在线| 国产精品一区无码| 在线日韩av片| 进去里视频在线观看| 欧美性生活一区| 国产精品无码在线播放| 欧美一区二区三区电影| www.色婷婷.com| 精品1区2区在线观看| 天堂网www中文在线| 亚洲欧美国内爽妇网| 国产天堂素人系列在线视频| 一区二区三区国产视频| 99青草视频在线播放视| 久久精品亚洲国产| 伊人福利在线| 97国产精品免费视频| 视频二区不卡| 成人久久一区二区三区| 亚洲91网站| 久久99九九| 人人狠狠综合久久亚洲婷婷| 在线观看免费黄色片| 伊人影院久久| 免费男同深夜夜行网站| 韩国理伦片一区二区三区在线播放| 黄色a级三级三级三级| aaa国产一区| 69精品无码成人久久久久久| 椎名由奈av一区二区三区| 国产一级片视频| 色菇凉天天综合网| 国产日韩一级片| 亚洲国产精品国自产拍av秋霞| 国产福利小视频在线观看| 欧美大奶子在线| 成人免费看视频网站| 成人精品久久久| 国产精品色在线网站| 亚洲精品8mav| 亚洲成色精品| 亚洲欧美自偷自拍另类| 成熟亚洲日本毛茸茸凸凹| 一区二区伦理片| 亚洲精品欧美综合四区| 日韩在线播放中文字幕| 欧美一级片在线观看| 欧美女优在线观看| 欧美高清电影在线看| av成人亚洲| 国产一区二区三区高清| 手机在线电影一区| 日韩欧美国产免费| 国产精选一区二区三区| 国产手机在线观看| 亚洲已满18点击进入久久| 五月激情丁香网| 日韩精品在线电影| 在线你懂的视频| 国产精品久久久久av免费| 精品少妇一区| 2022中文字幕| 麻豆91精品91久久久的内涵| 国产精品无码毛片| 一区二区三区在线视频免费| 超碰在线97观看| 日韩av有码在线| 久久av色综合| 亚洲一区二区三区成人在线视频精品 | 欧美大片一区二区| 在线观看av的网站| 日韩免费在线看| 老司机aⅴ在线精品导航| 8x8x华人在线| 麻豆91精品91久久久的内涵| 欧美 日韩 国产 成人 在线观看 | 国产ts变态重口人妖hd| 中文字幕日韩精品有码视频| 中文字幕在线官网| 国产一区二区不卡视频| 国精品一区二区三区| www.久久com| 亚洲三级在线播放| 中文字幕av影视| 国产一区二区三区在线看| 亚洲女同av| 欧美大陆一区二区| 99视频精品| 国产激情视频网站| 亚欧色一区w666天堂| 性做久久久久久久久久| 欧美精品做受xxx性少妇| 亚洲影视资源| 99精品一区二区三区的区别| 极品少妇xxxx偷拍精品少妇| 黄色片网站在线播放| 欧美日本在线一区| 日本中文字幕伦在线观看| 成人动漫网站在线观看| 久久久久久久久久久久久久| 日韩欧美亚洲另类| 亚洲欧美日韩精品久久久久| 国产男男gay网站| 欧美人在线观看| 成人动漫视频| 国产淫片免费看| 国产人成一区二区三区影院| 这里只有精品免费视频| 永久免费精品影视网站| 美女久久久久久| 日本a级片在线观看| 成人精品国产福利| 国产欧美一区二区三区在线看蜜臂 | 男女污污视频网站| 亚洲一区av在线| 日韩a级作爱片一二三区免费观看| 国产精品99蜜臀久久不卡二区| 青青草91久久久久久久久| 免费不卡av网站| 午夜精品久久久久久| 国模吧精品人体gogo| 国产美女精彩久久| 国产精品mm| 亚洲av片不卡无码久久| 欧美乱妇15p| xxxx另类黑人| 亚洲高清123| 国产成人免费在线| 少妇一级淫片免费放中国| 夜夜嗨av一区二区三区免费区| 羞羞视频在线观看一区二区| 黄色一级片在线看| 国产日韩欧美高清| 国产黄色免费大片| 亲爱的老师9免费观看全集电视剧| 日本午夜一区| 国产精品熟妇一区二区三区四区| 精品国产1区2区| 免费的黄网站在线观看| 国产精品香蕉视屏| 日韩福利视频导航| 国产在线观看免费视频今夜| 亚洲人av在线影院| 日本高清久久| 国产裸体免费无遮挡| 亚洲一区二区四区蜜桃| 成人综合影院| 国产伦精品一区二区三毛| 日韩专区在线视频| 国产精品日日夜夜| 色噜噜亚洲精品中文字幕|