日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Liferay 控制面板在指定文件夹添加Basic Document流程分析

發布時間:2025/3/15 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Liferay 控制面板在指定文件夹添加Basic Document流程分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

結論:

當在Liferay中用管理員登錄,導航到控制面板->Documents and Media ,在指定文件夾下添加BasicDocument時,服務器做了如下的事情:

(1) 在DLFILEENTRY表中添加一條記錄代表被添加的文檔。

(2) 在DLFILEENTRYVERSION表中添加一條記錄,通過fileEntryId外鍵關聯到DLFILEENTRY表,用來記錄剛被添加文檔的版本信息。

(3)?在DLFOLDER表中更新最新post提交的時間戳。

(4) 根據服務器對于com.liferay.portlet.documentlibrary.store的具體實現的不同,先對文件進行病毒掃描(在portal.properties 中有開關),然后把上傳的資源文件存入到Store的某個具體位置。

Store有5種實現,我至少可以保證,如果用的是FileSystemStore,那么這個資源文件被放入$liferay_home/data/document_library目錄,并且最終文件名不再是上傳的文件名,而是<version_number>.如果使用的是DBStore,那么這個資源文件最終會被放在數據庫中DLCONTENT表中,并且資源文件(比如圖片)以BLOB的形式存儲。

(5)在ASSETENTRY表中添加一條記錄,它通過classpk外鍵關聯到DLFILEENTRY,因為File也是一種資產,所以必須在這張表中也留下記錄。

?

?

具體分析:

?Liferay控制面板中,當創建了文件夾,然后要在其中添加某個Basic Document:

?

查看瀏覽器debug信息:

可以發現,它調用的struts_action/document_library/edit_file_entry

?

我們去struts-config.xml中去找:

  • <action?path="/document_library/edit_file_entry"?type="com.liferay.portlet.documentlibrary.action.EditFileEntryAction">?
  • ????????????<forward?name="portlet.document_library.edit_file_entry"?path="portlet.document_library.edit_file_entry"?/>?
  • ????????????<forward?name="portlet.document_library.error"?path="portlet.document_library.error"?/>?
  • ????????</action>?
  • 可以發現, 它會forwardportlet.document_library.edit_file_entry的路徑名下找頁面:

    我們去tiles-def.xml中找匹配:

  • <definition?name="portlet.document_library.edit_file_entry"?extends="portlet.document_library">?
  • ????????<put?name="portlet_content"?value="/portlet/document_library/edit_file_entry.jsp"?/>?
  • ????</definition>?
  • ?

    所以,它最終會訪問/portlet/document_library/edit_file_entry.jsp頁面:

    這個頁面會吧你剛才選擇的目錄列出來,比如我們剛才選擇了abcde目錄,那么在這里,它就會顯示出來:

    對應的顯示代碼是

  • <aui:field-wrapper?label="folder">?
  • ????????????<aui:a?href="<%=?viewFolderURL?%>"?id="folderName"><%=?folderName?%></aui:a>?
  • ?
  • ????????????<c:if?test="<%=?referringPortletResourceRootPortletId.equals(PortletKeys.ASSET_PUBLISHER)?%>">?
  • ????????????????<aui:button?name="openFolderSelectorButton"?onClick='<%=?renderResponse.getNamespace()?+?"openFolderSelector();"?%>'?value="select"?/>?
  • ?
  • ????????????????<%?
  • ????????????????String?taglibRemoveFolder?=?"Liferay.Util.removeFolderSelection('folderId',?'folderName',?'"?+?renderResponse.getNamespace()?+?"');";?
  • ????????????????%>?
  • ?
  • ????????????????<aui:button?disabled="<%=?folderId?<=?0?%>"?name="removeFolderButton"?onClick="<%=?taglibRemoveFolder?%>"?value="remove"?/>?
  • ????????????</c:if>?
  • ????????</aui:field-wrapper>?

  • 然后,它會有一個文件上傳框:

  • <aui:input?name="file"?type="file">?
  • ????????????<aui:validator?name="acceptFiles">?
  • ????????????????'<%=?StringUtil.merge(PrefsPropsUtil.getStringArray(PropsKeys.DL_FILE_EXTENSIONS,?StringPool.COMMA))?%>'?
  • ????????????</aui:validator>?
  • ????????</aui:input>?
  • 它會通過aui框架的校驗器來校驗被上傳的文件擴展名和大小。

    輸入文件標題和正文的部分我就略過了,不是重點,我們現在想關注的是,到底當點擊最下方的"Publish"按鈕時發生了什么。

    ?

    深入分析點擊"Publish"按鈕后發生的事情

    對應的代碼是:

  • <aui:button?disabled="<%=?checkedOut?&&?!hasLock?||?(pending?&&?PropsValues.DL_FILE_ENTRY_DRAFTS_ENABLED)?%>"?name="publishButton"?type="submit"?value="<%=?publishButtonLabel?%>"?/>?

  • 它會吧整個表單提交,對應代碼是:

  • <aui:form?action="<%=?editFileEntryURL?%>"?cssClass="lfr-dynamic-form"?enctype="multipart/form-data"?method="post"?name="fm"?onSubmit='<%=?"event.preventDefault();?"?+?renderResponse.getNamespace()?+?"saveFileEntry(false);"?%>'>?
  • ????<aui:input?name="<%=?Constants.CMD?%>"?type="hidden"?/>?
  • ????<aui:input?name="redirect"?type="hidden"?value="<%=?redirect?%>"?/>?
  • ????<aui:input?name="backURL"?type="hidden"?value="<%=?backURL?%>"?/>?
  • ????<aui:input?name="referringPortletResource"?type="hidden"?value="<%=?referringPortletResource?%>"?/>?
  • ????<aui:input?name="uploadProgressId"?type="hidden"?value="<%=?uploadProgressId?%>"?/>?
  • ????<aui:input?name="repositoryId"?type="hidden"?value="<%=?repositoryId?%>"?/>?
  • ????<aui:input?name="folderId"?type="hidden"?value="<%=?folderId?%>"?/>?
  • ????<aui:input?name="fileEntryId"?type="hidden"?value="<%=?fileEntryId?%>"?/>?
  • ????<aui:input?name="workflowAction"?type="hidden"?value="<%=?WorkflowConstants.ACTION_PUBLISH?%>"?/>?
  • ..?
  • 而因為用post提交,所以這些信息都在payload中:

  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_formDate"?
  • ?
  • 1341536588996?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_cmd"?
  • ?
  • add?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_redirect"?
  • ?
  • http://localhost:8080/group/control_panel/manage?p_p_id=20&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&doAsGroupId=19&refererPlid=12655&_20_refererPlid=12655&_20_doAsGroupId=19&_20_struts_action=%2Fdocument_library%2Fview&_20_folderId=16904?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_backURL"?
  • ?
  • ?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_referringPortletResource"?
  • ?
  • ?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_uploadProgressId"?
  • ?
  • dlFileEntryUploadProgress?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_repositoryId"?
  • ?
  • 19?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_folderId"?
  • ?
  • 16904?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_fileEntryId"?
  • ?
  • 0?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_workflowAction"?
  • ?
  • 1?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_file";?filename="charles_wang.jpg"?
  • Content-Type:?p_w_picpath/jpeg?
  • ?
  • ?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_title"?
  • ?
  • title?of?new?document?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_description"?
  • ?
  • a?new?document?which?contains?a?p_w_picpath?and?resides?in?abcde?folder?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_fileEntryTypeId"?
  • ?
  • 0?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_assetTagNames"?
  • ?
  • ?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_assetLinkSearchContainerPrimaryKeys"?
  • ?
  • ?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_assetLinkEntryIds"?
  • ?
  • ?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_inputPermissionsShowOptions"?
  • ?
  • false?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_inputPermissionsViewRole"?
  • ?
  • Guest?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_guestPermissions"?
  • ?
  • ADD_DISCUSSION?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_guestPermissions"?
  • ?
  • VIEW?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_groupPermissions"?
  • ?
  • ADD_DISCUSSION?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D?
  • Content-Disposition:?form-data;?name="_20_groupPermissions"?
  • ?
  • VIEW?
  • ------WebKitFormBoundaryHrjra277wXTqeY5D--?
  • 所以,action還是自身頁面,不難在struts-config.xml中找到Action類名為EditFileEntryAction

    因為我們的cmd是add,所以它會走以下流程:

  • public?void?processAction(?
  • ????????????ActionMapping?mapping,?ActionForm?form,?PortletConfig?portletConfig,?
  • ????????????ActionRequest?actionRequest,?ActionResponse?actionResponse)?
  • ????????throws?Exception?{?
  • ?
  • ????????String?cmd?=?ParamUtil.getString(actionRequest,?Constants.CMD);?
  • ?
  • ????????..?
  • ????????????else?if?(cmd.equals(Constants.ADD)?||?cmd.equals(Constants.UPDATE)?
  • ????????????????||?cmd.equals(Constants.UPDATE_AND_CHECKIN))?{?
  • ?
  • ????????????????updateFileEntry(portletConfig,?actionRequest,?actionResponse);?
  • ????????????}?
  • ????????????..?
  • ?

    它會去調用updateFileEntry方法,這就是我們研究的重心:

  • protected?void?updateFileEntry(?
  • ????????????PortletConfig?portletConfig,?ActionRequest?actionRequest,?
  • ????????????ActionResponse?actionResponse)?
  • ????????throws?Exception?{?
  • ?
  • ????????UploadPortletRequest?uploadPortletRequest?=?
  • ????????????PortalUtil.getUploadPortletRequest(actionRequest);?
  • ?
  • ????????ThemeDisplay?themeDisplay?=?(ThemeDisplay)actionRequest.getAttribute(?
  • ????????????WebKeys.THEME_DISPLAY);?
  • ?
  • ????????String?cmd?=?ParamUtil.getString(uploadPortletRequest,?Constants.CMD);?
  • ?
  • ????????long?fileEntryId?=?ParamUtil.getLong(?
  • ????????????uploadPortletRequest,?"fileEntryId");?
  • ?
  • ????????long?repositoryId?=?ParamUtil.getLong(?
  • ????????????uploadPortletRequest,?"repositoryId");?
  • ????????long?folderId?=?ParamUtil.getLong(uploadPortletRequest,?"folderId");?
  • ????????String?sourceFileName?=?uploadPortletRequest.getFileName("file");?
  • ????????String?title?=?ParamUtil.getString(uploadPortletRequest,?"title");?
  • ????????String?description?=?ParamUtil.getString(?
  • ????????????uploadPortletRequest,?"description");?
  • ????????String?changeLog?=?ParamUtil.getString(?
  • ????????????uploadPortletRequest,?"changeLog");?
  • ????????boolean?majorVersion?=?ParamUtil.getBoolean(?
  • ????????????uploadPortletRequest,?"majorVersion");?
  • ?
  • ????????if?(folderId?>?0)?{?
  • ????????????Folder?folder?=?DLAppServiceUtil.getFolder(folderId);?
  • ?
  • ????????????if?(folder.getGroupId()?!=?themeDisplay.getScopeGroupId())?{?
  • ????????????????throw?new?NoSuchFolderException();?
  • ????????????}?
  • ????????}?
  • ?
  • ????????InputStream?inputStream?=?null;?
  • ?
  • ????????try?{?
  • ????????????String?contentType?=?uploadPortletRequest.getContentType("file");?
  • ?
  • ????????????long?size?=?uploadPortletRequest.getSize("file");?
  • ?
  • ????????????if?(cmd.equals(Constants.ADD)?&&?(size?==?0))?{?
  • ????????????????contentType?=?MimeTypesUtil.getContentType(title);?
  • ????????????}?
  • ?
  • ????????????if?(cmd.equals(Constants.ADD)?||?(size?>?0))?{?
  • ????????????????String?portletName?=?portletConfig.getPortletName();?
  • ?
  • ????????????????if?(portletName.equals(PortletKeys.MEDIA_GALLERY_DISPLAY))?{?
  • ????????????????????String?portletResource?=?ParamUtil.getString(?
  • ????????????????????????actionRequest,?"portletResource");?
  • ?
  • ????????????????????PortletPreferences?portletPreferences?=?null;?
  • ?
  • ????????????????????if?(Validator.isNotNull(portletResource))?{?
  • ????????????????????????PortletPreferencesFactoryUtil.getPortletSetup(?
  • ????????????????????????????actionRequest,?portletResource);?
  • ????????????????????}?
  • ????????????????????else?{?
  • ????????????????????????portletPreferences?=?actionRequest.getPreferences();?
  • ????????????????????}?
  • ?
  • ????????????????????String[]?mimeTypes?=?DLUtil.getMediaGalleryMimeTypes(?
  • ????????????????????????portletPreferences,?actionRequest);?
  • ?
  • ????????????????????if?(Arrays.binarySearch(mimeTypes,?contentType)?<?0)?{?
  • ????????????????????????throw?new?FileMimeTypeException(contentType);?
  • ????????????????????}?
  • ????????????????}?
  • ????????????}?
  • ?
  • ????????????inputStream?=?uploadPortletRequest.getFileAsStream("file");?
  • ?
  • ????????????ServiceContext?serviceContext?=?ServiceContextFactory.getInstance(?
  • ????????????????DLFileEntry.class.getName(),?actionRequest);?
  • ?
  • ????????????FileEntry?fileEntry?=?null;?
  • ?
  • ????????????if?(cmd.equals(Constants.ADD))?{?
  • ????????????????if?(Validator.isNull(title))?{?
  • ????????????????????title?=?sourceFileName;?
  • ????????????????}?
  • ?
  • ????????????????//?Add?file?entry?
  • ?
  • ????????????????fileEntry?=?DLAppServiceUtil.addFileEntry(?
  • ????????????????????repositoryId,?folderId,?sourceFileName,?contentType,?title,?
  • ????????????????????description,?changeLog,?inputStream,?size,?serviceContext);?
  • ?
  • ????????????????AssetPublisherUtil.addAndStoreSelection(?
  • ????????????????????actionRequest,?DLFileEntry.class.getName(),?
  • ????????????????????fileEntry.getFileEntryId(),?-1);?
  • ????????????}?
  • ????????????else?if?(cmd.equals(Constants.UPDATE_AND_CHECKIN))?{?
  • ?
  • ????????????????//?Update?file?entry?and?checkin?
  • ?
  • ????????????????fileEntry?=?DLAppServiceUtil.updateFileEntryAndCheckIn(?
  • ????????????????????fileEntryId,?sourceFileName,?contentType,?title,?
  • ????????????????????description,?changeLog,?majorVersion,?inputStream,?
  • ????????????????????size,?serviceContext);?
  • ????????????}?
  • ????????????else?{?
  • ?
  • ????????????????//?Update?file?entry?
  • ?
  • ????????????????fileEntry?=?DLAppServiceUtil.updateFileEntry(?
  • ????????????????????fileEntryId,?sourceFileName,?contentType,?title,?
  • ????????????????????description,?changeLog,?majorVersion,?inputStream,?
  • ????????????????????size,?serviceContext);?
  • ????????????}?
  • ?
  • ????????????AssetPublisherUtil.addRecentFolderId(?
  • ????????????????actionRequest,?DLFileEntry.class.getName(),?folderId);?
  • ????????}?
  • ????????finally?{?
  • ????????????StreamUtil.cleanUp(inputStream);?
  • ????????}?
  • ????}?
  • ?

    從第06-27行就是從post的請求的payload中獲取一些參數信息,然后第29行對folderId進行判斷,因為我們的folderId為19604,它大于0,所以第30行用DLAppServiceUtil的方法獲取這個folder的實例,它最終會調用DLFolderLocalServiceImplgetFolder(folderId)方法:

  • public?DLFolder?getFolder(long?folderId)?
  • ????????throws?PortalException,?SystemException?{?
  • ?
  • ????????return?dlFolderPersistence.findByPrimaryKey(folderId);?
  • ????}?
  • 這會發起一個數據庫的查詢,然后把查出來的結果封裝成DLFolder對象:

    從這里看出來,這個folder就是我們昨天創建的名字叫"abcde"的folder.

    ?

    然后從40行開始,正式對于這個文檔中的文件進行操作。先從40-72行做一些信息提取工作,然后從74行開始正式上傳文件,因為我們的cmd是“add",所以它會執行86-95行,我們詳細分析:

    ?

    添加FileEntry:

    第88-90行最終會調用DLAppServiceImpl類的addFileEntry方法:

  • public?FileEntry?addFileEntry(?
  • ????????????long?repositoryId,?long?folderId,?String?sourceFileName,?
  • ????????????String?mimeType,?String?title,?String?description,?String?changeLog,?
  • ????????????InputStream?is,?long?size,?ServiceContext?serviceContext)?
  • ????????throws?PortalException,?SystemException?{?
  • ?
  • ????????if?(is?==?null)?{?
  • ????????????is?=?new?UnsyncByteArrayInputStream(new?byte[0]);?
  • ????????????size?=?0;?
  • ????????}?
  • ?
  • ????????Repository?repository?=?getRepository(repositoryId);?
  • ?
  • ????????FileEntry?fileEntry?=?repository.addFileEntry(?
  • ????????????folderId,?sourceFileName,?mimeType,?title,?description,?changeLog,?
  • ????????????is,?size,?serviceContext);?
  • ?
  • ????????dlAppHelperLocalService.addFileEntry(?
  • ????????????getUserId(),?fileEntry,?fileEntry.getFileVersion(),?serviceContext);?
  • ?
  • ????????return?fileEntry;?
  • ????}?
  • 它一共做了2件事情:

    ?

    事情1:

    第14行-15行,它最終會調用DLFileEntryLocalServiceImpl類的addFileEntry方法:

  • public?DLFileEntry?addFileEntry(?
  • ????????????long?userId,?long?groupId,?long?repositoryId,?long?folderId,?
  • ????????????String?sourceFileName,?String?mimeType,?String?title,?
  • ????????????String?description,?String?changeLog,?long?fileEntryTypeId,?
  • ????????????Map<String,?Fields>?fieldsMap,?File?file,?InputStream?is,?long?size,?
  • ????????????ServiceContext?serviceContext)?
  • ????????throws?PortalException,?SystemException?{?
  • ?
  • ????????if?((size?==?0)?&&?Validator.isNull(title))?{?
  • ????????????throw?new?FileNameException();?
  • ????????}?
  • ?
  • ????????//?File?entry?
  • ?
  • ????????User?user?=?userPersistence.findByPrimaryKey(userId);?
  • ????????folderId?=?dlFolderLocalService.getFolderId(?
  • ????????????user.getCompanyId(),?folderId);?
  • ????????String?name?=?String.valueOf(?
  • ????????????counterLocalService.increment(DLFileEntry.class.getName()));?
  • ????????String?extension?=?getExtension(title,?sourceFileName);?
  • ????????fileEntryTypeId?=?getFileEntryTypeId(?
  • ????????????DLUtil.getGroupIds(groupId),?folderId,?fileEntryTypeId);?
  • ????????Date?now?=?new?Date();?
  • ?
  • ????????validateFile(groupId,?folderId,?title,?extension,?file,?is);?
  • ?
  • ????????long?fileEntryId?=?counterLocalService.increment();?
  • ?
  • ????????DLFileEntry?dlFileEntry?=?dlFileEntryPersistence.create(fileEntryId);?
  • ?
  • ????????dlFileEntry.setUuid(serviceContext.getUuid());?
  • ????????dlFileEntry.setGroupId(groupId);?
  • ????????dlFileEntry.setCompanyId(user.getCompanyId());?
  • ????????dlFileEntry.setUserId(user.getUserId());?
  • ????????dlFileEntry.setUserName(user.getFullName());?
  • ????????dlFileEntry.setVersionUserId(user.getUserId());?
  • ????????dlFileEntry.setVersionUserName(user.getFullName());?
  • ????????dlFileEntry.setCreateDate(serviceContext.getCreateDate(now));?
  • ????????dlFileEntry.setModifiedDate(serviceContext.getModifiedDate(now));?
  • ????????dlFileEntry.setRepositoryId(repositoryId);?
  • ????????dlFileEntry.setFolderId(folderId);?
  • ????????dlFileEntry.setName(name);?
  • ????????dlFileEntry.setExtension(extension);?
  • ????????dlFileEntry.setMimeType(mimeType);?
  • ????????dlFileEntry.setTitle(title);?
  • ????????dlFileEntry.setDescription(description);?
  • ????????dlFileEntry.setFileEntryTypeId(fileEntryTypeId);?
  • ????????dlFileEntry.setVersion(DLFileEntryConstants.VERSION_DEFAULT);?
  • ????????dlFileEntry.setSize(size);?
  • ????????dlFileEntry.setReadCount(DLFileEntryConstants.DEFAULT_READ_COUNT);?
  • ?
  • ????????dlFileEntryPersistence.update(dlFileEntry,?false);?
  • ?
  • ????????//?File?version?
  • ?
  • ????????DLFileVersion?dlFileVersion?=?addFileVersion(?
  • ????????????user,?dlFileEntry,?serviceContext.getModifiedDate(now),?extension,?
  • ????????????mimeType,?title,?description,?null,?StringPool.BLANK,?
  • ????????????fileEntryTypeId,?fieldsMap,?DLFileEntryConstants.VERSION_DEFAULT,?
  • ????????????size,?WorkflowConstants.STATUS_DRAFT,?serviceContext);?
  • ?
  • ????????dlFileEntry.setFileVersion(dlFileVersion);?
  • ?
  • ????????//?Folder?
  • ?
  • ????????if?(folderId?!=?DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)?{?
  • ????????????dlFolderLocalService.updateLastPostDate(?
  • ????????????????dlFileEntry.getFolderId(),?dlFileEntry.getModifiedDate());?
  • ????????}?
  • ?
  • ????????//?File?
  • ?
  • ????????if?(file?!=?null)?{?
  • ????????????DLStoreUtil.addFile(?
  • ????????????????user.getCompanyId(),?dlFileEntry.getDataRepositoryId(),?name,?
  • ????????????????false,?file);?
  • ????????}?
  • ????????else?{?
  • ????????????DLStoreUtil.addFile(?
  • ????????????????user.getCompanyId(),?dlFileEntry.getDataRepositoryId(),?name,?
  • ????????????????false,?is);?
  • ????????}?
  • ?
  • ????????return?dlFileEntry;?
  • ????}?
  • 所以,總結來說就是(13-52行)在DLFILEENTRY表中添加一條記錄,代表了我們剛創建的文件:

    然后(54-62行)在DLFILEVERSION表中添加一條記錄:

    然后(64-69行)在DLFOLDER表中更新最新post提交的時間戳:

    然后(73-82行)會添加這個我們被上傳的文件(比如 charles_wang.jpg), 如何添加呢?可以一直跟進直到DLStoreImpl類的addFile方法:

  • public?void?addFile(?
  • ????????????long?companyId,?long?repositoryId,?String?fileName,?
  • ????????????boolean?validateFileExtension,?File?file)?
  • ????????throws?PortalException,?SystemException?{?
  • ?
  • ????????validate(fileName,?validateFileExtension,?file);?
  • ?
  • ????????if?(PropsValues.DL_STORE_ANTIVIRUS_ENABLED)?{?
  • ????????????AntivirusScannerUtil.scan(file);?
  • ????????}?
  • ?
  • ????????store.addFile(companyId,?repositoryId,?fileName,?file);?
  • ????}?
  • 它首先會判斷是否開啟了store的病毒掃描機制,這個變量定義在portal.properties文件中:

  • ???#?Set?this?property?to?true?to?enable?execution?of?antivirus?check?when?
  • ???#?files?are?submitted?into?a?store.?Setting?this?value?to?true?will?prevent?
  • ???#?any?potential?virus?files?from?entering?the?store?but?will?not?allow?for?
  • ???#?file?quarantines.?
  • ???#?
  • ???dl.store.antivirus.enabled=false?
  • 然后調用store的addFile方法,它會具體根據我們Store的實現來決定如何添加這個資源文件。

    ?那么我們的服務器上用的是什么樣的store呢?可以參見portal.properties中的定義:

  • #?
  • ???#?Set?the?name?of?a?class?that?implements?
  • ???#?com.liferay.portlet.documentlibrary.store.Store.?The?
  • ???#?document?library?server?will?use?this?to?persist?documents.?
  • ???#?
  • ???#dl.store.impl=com.liferay.portlet.documentlibrary.store.AdvancedFileSystemStore?
  • ???#dl.store.impl=com.liferay.portlet.documentlibrary.store.CMISStore?
  • ???#dl.store.impl=com.liferay.portlet.documentlibrary.store.DBStore?
  • ???dl.store.impl=com.liferay.portlet.documentlibrary.store.FileSystemStore?
  • ???#dl.store.impl=com.liferay.portlet.documentlibrary.store.JCRStore?
  • ???#dl.store.impl=com.liferay.portlet.documentlibrary.store.S3Store?
  • ?

    所以,我們會用FileSystemStore作為Store的實現,這也是默認的實現。

  • public?void?addFile(?
  • ????????????long?companyId,?long?repositoryId,?String?fileName,?InputStream?is)?
  • ????????throws?PortalException,?SystemException?{?
  • ?
  • ????????try?{?
  • ????????????File?fileNameVersionFile?=?getFileNameVersionFile(?
  • ????????????????companyId,?repositoryId,?fileName,?VERSION_DEFAULT);?
  • ?
  • ????????????if?(fileNameVersionFile.exists())?{?
  • ????????????????throw?new?DuplicateFileException(fileNameVersionFile.getPath());?
  • ????????????}?
  • ?
  • ????????????FileUtil.write(fileNameVersionFile,?is);?
  • ????????}?
  • ????????catch?(IOException?ioe)?{?
  • ????????????throw?new?SystemException(ioe);?
  • ????????}?
  • ????}?
  • 從調試信息上來看,它會先去獲取companyId,repositoryId,fileName等信息,最終File對象是服務器節點上一個帶版本號的url:

    而被上傳的文件也被蓋頭換面了,居然在$tomcat_home/temp目錄下,而且名字叫upload_000010.jpg,我們在這個目錄下找,是我們所要上傳的文件:

    ?

    所以,最終這個文件被保存到了D:\Liferay_Cluster_Enterprise\Node1\liferay-portal-tomcat-6.1.10-ee-ga1\liferay-portal-6.1.10-ee-ga1\data\document_library\1\16904\501 目錄下,并且文件名不再是charles_wang.png,而是就叫<version_number>.并且后面不帶擴展名了。我們比較這charles_wang.png和這個1.0文件的大小,發現他們是一致的(都是153kb),所以這說明文件已經被復制到了Liferay節點上。

    ?

    進一步研究,如果不使用FileSystemStore會如何。我們在portal-ext.properties?dl.store.impl改為DBStore:

  • dl.store.impl=com.liferay.portlet.documentlibrary.store.DBStore?
  • 它會去調用DBStore類的addFile代碼,最終會調用DBStore類的updateFile代碼:

  • public?void?updateFile(?
  • ????????????long?companyId,?long?repositoryId,?String?fileName,?
  • ????????????String?versionLabel,?File?file)?
  • ????????throws?PortalException,?SystemException?{?
  • ?
  • ????????if?(DLContentLocalServiceUtil.hasContent(?
  • ????????????????companyId,?repositoryId,?fileName,?versionLabel))?{?
  • ?
  • ????????????throw?new?DuplicateFileException(fileName);?
  • ????????}?
  • ?
  • ????????InputStream?inputStream?=?null;?
  • ?
  • ????????try?{?
  • ?????????????inputStream?=?new?FileInputStream(file);?
  • ????????}?
  • ????????catch?(FileNotFoundException?fnfe)?{?
  • ????????????throw?new?SystemException(fnfe);?
  • ????????}?
  • ?
  • ????????DLContentLocalServiceUtil.addContent(?
  • ????????????companyId,?repositoryId,?fileName,?versionLabel,?inputStream,?
  • ????????????file.length());?
  • ????}?
  • 它最終會調用DLContentLocalServiceImpl的addContent方法:

  • public?DLContent?addContent(?
  • ????????????long?companyId,?long?repositoryId,?String?path,?String?version,?
  • ????????????InputStream?inputStream,?long?size)?
  • ????????throws?SystemException?{?
  • ?
  • ????????try?{?
  • ????????????long?contentId?=?counterLocalService.increment();?
  • ?
  • ????????????DLContent?dlContent?=?dlContentPersistence.create(contentId);?
  • ?
  • ????????????dlContent.setCompanyId(companyId);?
  • ????????????dlContent.setRepositoryId(repositoryId);?
  • ????????????dlContent.setPath(path);?
  • ????????????dlContent.setVersion(version);?
  • ?
  • ????????????OutputBlob?dataOutputBlob?=?new?OutputBlob(inputStream,?size);?
  • ?
  • ????????????dlContent.setData(dataOutputBlob);?
  • ?
  • ????????????dlContent.setSize(size);?
  • ?
  • ????????????dlContentPersistence.update(dlContent,?false);?
  • ?
  • ????????????return?dlContent;?
  • ????????}?
  • ????????finally?{?
  • ????????????StreamUtil.cleanUp(inputStream);?
  • ????????}?
  • ????}?
  • 從這里我們可以很清楚的看到,它會吧這個文件的內容以Blob的形式保存,然后連同companyId,repositoryId,version等信息一起寫在DLCONTENT數據庫表中:

    我們復制上述動作時候,不幸發生了如下的異常:

  • Caused?by:?java.lang.ClassCastException:?com.liferay.portal.kernel.dao.jdbc.OutputBlob?cannot?be?cast?to?oracle.sql.BLOB?
  • ????at?oracle.jdbc.driver.OraclePreparedStatement.setBlob(OraclePreparedStatement.java:6663)?
  • ????at?oracle.jdbc.driver.OraclePreparedStatementWrapper.setBlob(OraclePreparedStatementWrapper.java:128)?
  • 從http://issues.liferay.com/browse/LPS-26375上我找到了解決方法,就是修改portal-hbm.xml文件,然后把類型配置正確就可以了:

  • <class?name="com.liferay.portlet.documentlibrary.model.DLContentDataBlobModel"?table="DLContent"?lazy="true">?
  • ????????<id?name="contentId"?column="contentId">?
  • ????????????<generator?class="foreign">?
  • ????????????????<param?name="property">com.liferay.portlet.documentlibrary.model.impl.DLContentImpl</param>?
  • ????????????</generator>?
  • ????????</id>?
  • ????????<property?column="data_"?name="dataBlob"?type="org.hibernate.type.BlobType"?/>?
  • ????</class>?
  • ?把這里的dataBlob的type改為java.sql.Blob就可以了。

    為此,我們新建一個文件叫portal-hbm-new.xml,讓其復制portal-hbm.xml的所有內容,除了dataBlob的type改為java.sql.Blob。

    然后我們在portal-ext.properties中添加如下行,讓hibernate映射文件指向我們新建的這個文件:

  • #added?by?charles?to?fix?the?dbStore?problem?,use?the?new?portal?hibernate?mapping?file?
  • ??hibernate.configs=\?
  • ????????META-INF/mail-hbm.xml,\?
  • ????????META-INF/portal-hbm-new.xml,\?
  • ????????META-INF/ext-hbm.xml?
  • ?這樣,我們就上傳成功了:

    我們檢查數據庫,在DLCONTENT表中果然找到了blob形式存在的圖片:

    ?

    事情2:

    第18行-19行,它最終會調用DLAppHelperLocalServiceImpladdFileEntry方法,具體不展開了,結論就是,它會在AssetEntry數據庫表中添加一條記錄:

    ?

    到此,我們全部分析完了。

    ?

    轉載于:https://blog.51cto.com/supercharles888/921761

    總結

    以上是生活随笔為你收集整理的Liferay 控制面板在指定文件夹添加Basic Document流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲欧美日韩精品久久奇米一区 | 天天翘av| 国产原创在线观看 | 天天摸天天操天天舔 | 永久免费观看视频 | 色丁香色婷婷 | 99久久久久久 | 日韩欧美视频一区二区三区 | 亚洲精品免费在线播放 | 成人一级 | 国产一区二区免费看 | 久久电影色 | 天天操福利视频 | 亚洲黄色免费在线看 | 在线播放av网址 | 亚洲欧美国内爽妇网 | 国产视频一区二区在线观看 | 国产香蕉av | 国产精品99久久久久久宅男 | 天天操人| 欧美日韩国产精品爽爽 | 欧美日韩精品二区第二页 | 五月婷婷色 | 97国产在线| 黄色片网站av | 久久久午夜精品福利内容 | 99久久精品一区二区成人 | 亚洲欧美日韩不卡 | 久草影视在线观看 | av五月婷婷 | 日韩精品欧美精品 | 日韩欧美在线高清 | 一区二区欧美日韩 | 99热最新精品 | 亚洲激情电影在线 | 伊人欧美| 黄色网免费 | 日韩女同一区二区三区在线观看 | 亚洲毛片在线观看. | 国产3p视频| 九九热免费观看 | 男女啪啪免费网站 | 国产成人在线看 | 99视频在线播放 | 天天综合网久久 | 中国老女人日b | sm免费xx网站 | 亚洲a网 | 九九免费在线观看视频 | 精品一区二区免费 | 97**国产露脸精品国产 | 在线视频中文字幕一区 | 国产成人精品久久亚洲高清不卡 | 激情丁香婷婷 | 欧美黄色成人 | www.91国产| 欧美色图p | 中文字幕精品视频 | 亚洲精品午夜视频 | 成人在线观看影院 | 成人黄色小说视频 | 免费看三片| 色免费在线 | 国产专区视频在线 | 欧美一区二区免费在线观看 | 久久久久久综合 | 国产手机精品视频 | 三级黄色网络 | 丁香六月色| 91精品一区二区三区蜜臀 | 蜜臀av网址| 亚洲欧美日韩一区二区三区在线观看 | 91精品视频在线观看免费 | 国产视频精品久久 | 狠狠综合 | 午夜久久久久久久久久久 | adc在线观看| 国产91亚洲 | 国产成人333kkk | 日日夜夜狠狠 | 久久综合久久综合这里只有精品 | 亚洲日本欧美在线 | 日韩精品一区二区三区视频播放 | 国产在线观看一区 | 亚洲精品国产精品久久99热 | 欧美日韩高清一区二区 国产亚洲免费看 | 天天看天天干天天操 | 91精品国产综合久久福利 | 色吊丝在线永久观看最新版本 | 开心丁香婷婷深爱五月 | 亚洲天天在线日亚洲洲精 | 国产黄色精品 | 国产精品久久久久久妇 | 国产成人精品午夜在线播放 | 成人蜜桃视频 | 欧美成人h版在线观看 | 91国内在线 | 女女av在线| 中文字幕免 | 三级黄色大片在线观看 | 国产精品1区2区3区在线观看 | 91黄视频在线观看 | 91超级碰碰| 天天狠狠操 | 亚洲日日射 | 伊人成人精品 | 17videosex性欧美 | 天天干天天操av | 国产精品久久久久久久久久久久午 | 久久免费视频3 | 黄色com| 开心激情五月网 | 久草免费在线观看视频 | 国产成人a亚洲精品 | 人人cao| 久久人人爽人人片 | 日韩在线观看网址 | 国产精品一区免费看8c0m | 香蕉网在线观看 | 精品国产乱码久久久久久1区2匹 | 天天操综合网 | 伊人超碰在线 | 成人精品视频 | 成人免费 在线播放 | 久久99精品波多结衣一区 | 国产色区| av一级片网站 | 国产黄a三级三级 | 国产精品一区二区免费看 | 91精品老司机久久一区啪 | 在线精品视频在线观看高清 | 欧美精品在线一区二区 | 国产特级毛片aaaaaa高清 | 精品视频不卡 | 久久av影院 | 国产精品亚洲片在线播放 | 九九色在线观看 | 久久天天躁夜夜躁狠狠85麻豆 | 天堂va在线观看 | 免费视频在线观看网站 | 日韩在线视频一区二区三区 | 91少妇精拍在线播放 | 99国产情侣在线播放 | 狠狠干天天色 | 婷婷激情久久 | 色婷婷成人网 | 精品在线观看一区二区三区 | 国产精品一级视频 | 久久免费99| 久久久久久久久亚洲精品 | 国产亚州av| 久久久人 | www.com久久久| av中文字幕在线观看网站 | 国产成人久久精品一区二区三区 | 免费av在线网 | 亚洲精品乱码久久久久久按摩 | 91精品国产92久久久久 | 国产手机免费视频 | 日本丶国产丶欧美色综合 | 婷婷激情在线 | 欧美 日韩 视频 | 久久综合九色综合97婷婷女人 | 国产在线观看污片 | 日韩视频一区二区三区在线播放免费观看 | 97人人澡人人添人人爽超碰 | 一级久久精品 | av在线播放网址 | av在线免费不卡 | 亚州五月 | 成人永久视频 | 伊人亚洲精品 | 午夜精品电影 | 在线视频 区 | 久久久久久97三级 | 在线免费观看黄 | 亚洲男人天堂2018 | 久久你懂的| 日韩在线小视频 | 久久久久久久久久久国产精品 | 婷婷色在线观看 | 久久人人添人人爽添人人88v | 欧美日韩aaaa| 夜夜躁天天躁很躁波 | 中文字幕视频观看 | 九色在线视频 | 久久精品精品电影网 | 人人舔人人插 | 96精品视频 | 美女久久99 | 国产资源站 | 日韩一区二区三区免费电影 | 国产综合小视频 | 97av视频在线 | 国产在线精品区 | 99免费看片 | 国产精品美 | 日韩欧美电影在线观看 | 国产黄色资源 | 欧美一区二区在线看 | 91网在线看 | 亚洲免费av在线 | 91污污| 欧美精彩视频在线观看 | 激情视频免费在线 | 亚洲免费a | 成人免费在线观看入口 | 国产精品9999| 国产成人一区二区三区久久精品 | 国内精品二区 | 亚洲视频精品在线 | 日本精品视频在线播放 | av一区在线 | 国产成人免费av电影 | 欧美成人中文字幕 | 在线观看日本韩国电影 | 精品欧美乱码久久久久久 | 国产精品久久久久久久久久99 | 日韩精品一区二区免费 | 91亚洲精品久久久久图片蜜桃 | 国产爽视频| www.天天射.com | 人人讲下载 | 五月天免费网站 | 极品久久久久久久 | 国产一区二区在线免费观看 | 欧美a级一区二区 | 综合伊人av| 亚洲精品日韩一区二区电影 | 久久精品免费电影 | 永久免费精品视频网站 | 伊人永久 | 韩国三级av在线 | 亚洲91视频 | 日韩激情免费视频 | 国产一区二区在线观看视频 | 国产丝袜在线 | av在线永久免费观看 | 亚洲精品视频在线观看免费视频 | 日本久久成人中文字幕电影 | 综合网天天色 | 99色免费 | 亚洲精品视频免费看 | 国产精品video爽爽爽爽 | 欧美精品在线一区二区 | 偷拍精偷拍精品欧洲亚洲网站 | 久久久国际精品 | 天天拍天天色 | 国内久久 | 91丨九色丨高潮 | 成人免费网站在线观看 | 综合婷婷丁香 | 综合黄色网 | 一区二区三区 亚洲 | 99免费在线视频观看 | 在线观看亚洲a | 99久久精品国产系列 | av网站有哪些 | 菠萝菠萝在线精品视频 | 日韩黄色在线观看 | 久久伦理电影 | 九九综合久久 | 麻豆手机在线 | 五月天丁香亚洲 | 米奇狠狠狠888 | 亚洲影视资源 | 欧美日韩国产精品一区 | 久草在线在线精品观看 | 免费视频久久久久久久 | 一区二区在线电影 | 欧美色噜噜 | 久久免费视频99 | 国产69久久 | 国产小视频福利在线 | 午夜精品在线看 | 99精品视频观看 | 国产成年人av | 天天摸天天操天天爽 | 亚洲一区二区三区毛片 | 夜夜夜影院 | 国产精品精品 | 亚洲在线视频网站 | 国产一区视频在线 | 日韩免费三区 | 婷婷亚洲综合五月天小说 | 亚洲成av人片在线观看香蕉 | 九九免费在线观看 | 色天天综合久久久久综合片 | 日日爱网站 | 国产99久 | 黄色app网站在线观看 | 日韩免费三级 | 91看片黄色| 国产日本高清 | 日韩va亚洲va欧美va久久 | 五月天天天操 | 亚洲精品玖玖玖av在线看 | 区一区二区三区中文字幕 | 欧美五月婷婷 | 免费在线播放视频 | 中文字幕国产精品一区二区 | 麻豆传媒视频观看 | 久草观看视频 | 国产亚洲精品无 | 精品国产亚洲一区二区麻豆 | 91禁看片| 国产小视频在线免费观看 | 久久久www成人免费精品张筱雨 | 91精品福利在线 | 欧美性一级观看 | 最新中文在线视频 | 国产麻豆精品传媒av国产下载 | 97精品久久 | 久久久久久久久久网站 | 久青草视频在线观看 | 成在线播放 | 激情五月婷婷综合网 | 91精品视频免费在线观看 | 97精品视频在线播放 | www.在线观看视频 | 久久久久久毛片精品免费不卡 | 久草久热 | 精品久久久久久久久亚洲 | 免费性网站 | 久久免费视频这里只有精品 | 麻豆 videos| 久热免费在线观看 | 国产小视频在线看 | 日韩精品视频免费看 | www.久久久精品 | 91精品国自产在线偷拍蜜桃 | 六月色 | 国产一级h | 日韩大片在线看 | 毛片基地黄久久久久久天堂 | 久久爱资源网 | 91精品国产91久久久久福利 | 人人草在线观看 | 丰满少妇对白在线偷拍 | 亚洲黄色av网址 | 天天天操天天天干 | 精品国精品自拍自在线 | 狠狠色狠狠色终合网 | 人人爱人人射 | 中文字幕永久免费 | 91精品国产自产91精品 | 天堂av免费在线 | a电影在线观看 | 精品在线视频播放 | 久久免费视频5 | 黄色软件视频大全免费下载 | 最新av在线播放 | 黄色免费视频在线观看 | 色在线免费 | 久久久久国产精品一区二区 | 国产午夜精品福利视频 | 色综合久久久久综合体 | 久香蕉| 中文字幕第一页在线播放 | 国产精品国产三级国产专区53 | 日韩免费视频一区二区 | 亚洲精品久久激情国产片 | 久久久久久久久久久免费av | 日韩视频一区二区三区在线播放免费观看 | 久久久精品综合 | 五月婷久久 | 欧美成人精品欧美一级乱 | adn—256中文在线观看 | 日韩黄色免费 | 欧美一级小视频 | 在线观看视频国产 | 久久久久久高潮国产精品视 | 中文字幕av在线播放 | 黄色视屏av | 国产韩国精品一区二区三区 | 日日躁夜夜躁aaaaxxxx | 国产黄a三级 | 日韩av电影中文字幕在线观看 | 日韩狠狠操 | 国产91综合一区在线观看 | 波多野结依在线观看 | 亚洲视频在线免费看 | 99久久久久久久久久 | 最近中文字幕完整高清 | 欧美一级片在线观看视频 | 日韩精品久久中文字幕 | 日韩黄色在线电影 | 日本精品视频在线播放 | 日韩高清免费观看 | 最近日本字幕mv免费观看在线 | 国产日韩中文字幕在线 | 成人免费观看av | 综合黄色网 | 国产日韩欧美在线观看视频 | avwww在线| 亚洲欧美视频在线 | 亚洲视频精选 | 黄色亚洲免费 | 亚洲视频在线观看网站 | 久草视频首页 | 国产日本在线观看 | 欧美日韩高清国产 | 在线免费高清视频 | 欧美日韩一级久久久久久免费看 | 国产在线观看二区 | 国产精品白浆视频 | 国产成人一区二区三区影院在线 | 亚洲一片黄| 色偷偷av男人天堂 | 91在线视频导航 | 91黄视频在线 | 久久字幕 | 天天射天天做 | 天天干夜夜想 | 成 人 黄 色 视频 免费观看 | 欧美性爽爽 | 成人9ⅰ免费影视网站 | 精品极品在线 | 国产黄色片在线免费观看 | 五月天.com | 999国产| 亚洲最大免费成人网 | 日韩色综合网 | 亚洲国产精品一区二区久久,亚洲午夜 | 9797在线看片亚洲精品 | 丁香久久久 | 日韩精品一区二区免费视频 | 亚洲黄色免费在线看 | 国产伦精品一区二区三区免费 | 国产一区免费视频 | 天天干天天在线 | 国产又粗又长又硬免费视频 | 粉嫩高清一区二区三区 | 玖草影院 | 婷婷综合伊人 | 国产精品免费久久久久久久久久中文 | 中文字幕 91 | 91九色成人蝌蚪首页 | 在线观看国产亚洲 | 国产探花在线看 | 中文字幕影视 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 久久久久女教师免费一区 | 欧美日韩a视频 | 亚洲精品久久久久58 | 久久久久久久久免费 | 国产手机视频精品 | 国产96精品 | 狠狠色伊人亚洲综合成人 | 久久精品国产亚洲精品 | 国产成人a亚洲精品v | 日本不卡一区二区三区在线观看 | 色婷婷综合视频在线观看 | 69欧美视频| 国产 日韩 中文字幕 | 成人免费在线视频 | 欧美福利片在线观看 | 成人免费观看电影 | 亚洲视频精品在线 | 国产在线小视频 | 夜夜夜草 | 日韩av在线小说 | 国产91免费看 | 国产免费观看高清完整版 | 欧美激情视频在线观看免费 | 黄色com| 在线国产小视频 | 手机色站 | 欧美日韩色婷婷 | 久久国产精品网站 | 免费看片成人 | 国产亚洲欧美日韩高清 | 久久免费视频一区 | 精品国产一区二区三区久久 | 国色天香永久免费 | 视频国产一区二区三区 | 日韩免费电影网站 | 天天色播 | 国产91欧美| 国产精品一区一区三区 | 91麻豆产精品久久久久久 | 久久蜜臀av| 91av在线免费看 | 欧美日韩高清不卡 | 色婷婷亚洲 | 手机色站 | 亚洲天堂激情 | 日韩久久在线 | 99精品在线视频播放 | 亚洲精品久久激情国产片 | 国产亚洲成av片在线观看 | 中文在线免费观看 | 日本黄色一级电影 | av免费黄色 | 国产中文字幕视频 | 中文字幕色综合网 | 久久伦理电影网 | 色婷婷五 | 蜜桃视频日本 | 亚洲3级 | 在线观看一区 | 午夜精品久久久久久99热明星 | 久久精品站 | 久久高清免费视频 | 精品国产一区二区在线 | 日韩av影片在线观看 | a在线观看国产 | 欧美日韩国产精品爽爽 | 蜜臀久久99静品久久久久久 | 国产精品成人久久久久 | 免费不卡中文字幕视频 | 一本到视频在线观看 | 亚洲综合激情 | 六月久久婷婷 | 88av色| 午夜视频二区 | 高清在线观看av | 高清一区二区三区 | 亚洲最新视频在线播放 | 西西大胆免费视频 | 国产精品成人免费精品自在线观看 | 四虎小视频 | 丝袜美腿av| 99免费看片 | 久久综合网色—综合色88 | 91网页版在线观看 | 视频一区二区三区视频 | 黄色在线成人 | 2023av在线 | 五月天婷婷丁香花 | 精品视频免费看 | 国产九九九精品视频 | 免费看黄20分钟 | 国产不卡av在线播放 | 亚洲精品国产综合久久 | 精品国产乱子伦一区二区 | wwxxxx日本| 日韩激情网 | 又黄又刺激的网站 | 日韩黄视频 | 在线中文字幕网站 | 白丝av在线 | 很污的网站 | 欧美成人91 | 久久久久激情 | 欧美精品乱码99久久影院 | 激情五月婷婷激情 | 亚洲视频,欧洲视频 | 国产精品久久一区二区三区, | 久久免费精品国产 | 日本女人的性生活视频 | 欧美性直播 | 久久国产网 | 色综合天天视频在线观看 | 国产福利一区在线观看 | 久久五月婷婷综合 | 麻豆精品传媒视频 | 国产黄色大片免费看 | 亚洲一区日韩精品 | 久久热亚洲| 成人欧美一区二区三区黑人麻豆 | 日本黄色免费在线 | 久久国产精品视频 | 国产精品成人久久久久 | 国产免费观看久久黄 | 国产欧美精品在线观看 | 久久电影国产免费久久电影 | 91av在线视频播放 | 天天做日日做天天爽视频免费 | 天天射综合网视频 | 色偷偷网站视频 | 欧美成人aa | 亚洲少妇影院 | 在线 国产 日韩 | 99精品一区二区三区 | 国产精品永久免费 | 91av久久 | 狠狠躁日日躁狂躁夜夜躁 | 97超碰人人看 | 日韩欧美一级二级 | www.夜夜爽| 精品久久久久一区二区国产 | 最新日韩精品 | 日韩大片在线 | 国产成人91 | 国产一级电影在线 | 久久免费视频在线 | 手机在线黄色网址 | 在线观看91视频 | 日韩专区在线观看 | 久草在| 911久久香蕉国产线看观看 | 手机av在线不卡 | 日韩特黄一级欧美毛片特黄 | 天天干天天拍天天操 | 久久理论影院 | 91精品人成在线观看 | 丁香婷婷久久 | 天天爽人人爽 | 久久爱www.| 操夜夜操 | 最新av观看 | 一级黄色电影网站 | 五月天亚洲激情 | 日韩精品中文字幕在线不卡尤物 | 日韩草比 | 在线观看日韩免费视频 | 国产精品美女久久久久久2018 | 波多野结衣最新 | 日日干干 | 最近乱久中文字幕 | 黄色av网站在线观看免费 | 91香蕉视频在线下载 | 激情综合色综合久久 | 亚洲精品视频在线观看免费视频 | 一本一本久久a久久 | 亚洲专区视频在线观看 | 亚洲一区二区观看 | 天天综合入口 | 成人免费视频在线观看 | www.香蕉视频 | 国产在线久久久 | 激情图片区 | 国产精品久久伊人 | 91九色成人| 91视频啊啊啊 | 久久久香蕉视频 | 欧美日本在线观看视频 | www.天天射.com | 五月天婷婷在线观看视频 | 精品在线一区二区 | 久久av一区二区三区亚洲 | 日韩av看片 | 日韩精品在线视频免费观看 | 日韩高清毛片 | 97超在线| 特级xxxxx欧美 | 色婷婷激情电影 | 成人在线视频你懂的 | 99久久久久国产精品免费 | 国产视频一区在线播放 | 99精品色| 国产一二区在线观看 | 亚洲国产欧洲综合997久久, | 午夜丁香网 | 天天色天天色 | 久久国产免费视频 | 国产精品嫩草69影院 | 亚州精品天堂中文字幕 | 天天综合色天天综合 | 久久免费视频1 | 黄色软件视频大全免费下载 | 在线电影播放 | 中文字幕在线看视频 | 久久草在线视频国产 | 色综合久久久久综合体 | 欧美一级视频在线观看 | 日日干日日操 | 奇米7777狠狠狠琪琪视频 | 91超级碰| 懂色av一区二区三区蜜臀 | 最新日韩视频在线观看 | 日韩免费一区二区在线观看 | 天天插视频 | 91久久黄色 | 探花视频在线版播放免费观看 | 黄色成人在线网站 | 国产精品入口麻豆 | 有码一区二区三区 | 成人日韩av| 成人avav| 99电影456麻豆 | 国产婷婷一区二区 | 超碰九九 | 激情文学丁香 | 亚洲成av人片在线观看无 | 国产精品一区二区久久国产 | 久久国产一区二区 | 午夜精品一区二区三区可下载 | 久久久久久久久艹 | 免费毛片一区二区三区久久久 | 99久久久国产免费 | 黄p网站在线观看 | 中文字幕国产一区二区 | se视频网址 | 久久精品观看 | 樱空桃av | 日韩欧美在线观看一区二区三区 | 成人午夜电影在线 | 日本性高潮视频 | 国产精品a久久久久 | 欧美一级久久久 | 999久久国产| 夜添久久精品亚洲国产精品 | 色福利网 | 国产精品高清在线观看 | 黄色三级免费 | 天天干天天射天天爽 | 欧美日韩国产免费视频 | 97成人资源站 | 久久国产三级 | 久久免费国产精品1 | 国产一级在线播放 | 91精品国产99久久久久久久 | 91av资源网| 国产小视频你懂的在线 | 玖玖爱在线观看 | 粉嫩av一区二区三区四区在线观看 | 日日操狠狠干 | 日韩色av色资源 | 日操干 | 在线观看国产 | 99精品观看 | 久久精品日韩 | 日韩成人免费在线电影 | 婷婷六月色 | www.亚洲黄色 | 欧美精品在线观看 | 欧美日韩1区 | 久久蜜臀一区二区三区av | 欧美日本三级 | 狠狠插狠狠干 | 日日日日日 | 高清视频一区二区三区 | 不卡的av中文字幕 | 亚洲精品美女久久久久网站 | 在线一级片 | 欧美日韩午夜在线 | 国产黄免费 | avwww在线观看 | 特级西西人体444是什么意思 | 国产精品 日本 | 精品国产人成亚洲区 | 天天射天天操天天 | 九九视频免费在线观看 | 91免费观看国产 | 精品国产99 | 久久久人人爽 | 天天操天天色综合 | 一级黄色片毛片 | 91精品国产乱码久久桃 | 99在线精品观看 | 精品美女国产在线 | 最近中文字幕免费大全 | 天天激情综合网 | 手机在线永久免费观看av片 | 在线免费成人 | 四虎国产精品免费观看视频优播 | 亚洲色图激情文学 | 在线观看www视频 | 久久精品视频一 | 日本黄色a级大片 | 九九精品视频在线观看 | 日韩欧美精品在线 | 久久久久久久久久久综合 | 中文在线免费看视频 | 97视频中文字幕 | 国产艹b视频 | 综合色综合| 国产黄色片在线免费观看 | 欧美成人中文字幕 | 欧美精品久久久久久久久久 | 久久永久免费视频 | 欧美美女视频在线观看 | 婷婷久久久 | 伊人婷婷| 麻豆你懂的 | 亚洲午夜电影网 | 日韩午夜小视频 | 日本精a在线观看 | caobi视频 | 中文字幕日本在线观看 | 国产午夜三级一区二区三 | 欧美激情视频一区 | 免费又黄又爽的视频 | 亚洲精品自拍视频在线观看 | 亚洲一级久久 | 免费av在线网站 | 91久久一区二区 | www.69xx| 亚洲欧洲成人 | 欧美日韩国产二区三区 | 欧美一二三视频 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 99久久精品国产免费看不卡 | 在线观看免费观看在线91 | 欧美一级久久久 | 黄色av在 | 天天综合中文 | 玖玖爱免费视频 | 亚洲美女免费精品视频在线观看 | 五月激情天 | 成人一区二区三区在线观看 | 午夜精品av在线 | 欧美网址在线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 久久成人精品电影 | 久久99亚洲精品久久 | 激情网在线视频 | 成人欧美一区二区三区在线观看 | 亚洲精品美女久久久 | 免费国产亚洲视频 | 国产精品婷婷 | 中文乱码视频在线观看 | 日日夜夜亚洲 | 精品一二区 | 国产精品一区免费观看 | 欧美精品乱码久久久久久 | 91成人免费观看视频 | 激情在线网址 | 狠狠精品 | 久久九九九九 | 国产精品theporn | 欧美精品在线观看免费 | 又长又大又黑又粗欧美 | 91免费国产在线观看 | 久久国产精品久久久 | 欧美激情综合五月色丁香小说 | 成年人在线播放视频 | 狠狠色丁香| 狠狠色丁香婷婷综合基地 | 国产精品久久久久久久久久久久久久 | 黄网站色成年免费观看 | 国产亚洲欧美精品久久久久久 | 91九色精品 | 人人操日日干 | 日韩啪啪小视频 | 97**国产露脸精品国产 | 伊人五月 | 欧美日韩三区二区 | 丝袜制服综合网 | 91综合色 | 人人爽人人爽人人片av | 99久久这里只有精品 | a v在线视频| 欧美va天堂在线电影 | 天天干人人 | 久久开心激情 | 日韩专区在线 | 国产第一二区 | 日韩在线观看网址 | 亚洲一区二区精品视频 | 久草青青在线观看 | 久久深夜福利免费观看 | 亚洲精品视频二区 | 久久久久国产精品免费网站 | 99久久精品国产一区二区成人 | av免费在线免费观看 | 国模精品在线 | 又大又硬又黄又爽视频在线观看 | 99热播精品 | 国产一区二区三区高清播放 | 人人爱在线视频 | 中文字幕在线播出 | 国产精品美女在线 | 久久久资源网 | 久草久草在线 | 天天操天天干天天爱 | 菠萝菠萝在线精品视频 | 99精品一级欧美片免费播放 | 正在播放一区二区 | 97超碰人人 | 欧美精品乱码久久久久久 | 999久久国精品免费观看网站 | 中文字幕av免费观看 | 中文字幕在线免费看线人 | 久久国产精彩视频 | 五月综合激情婷婷 | 五月婷在线视频 | 免费网站黄 | 欧美精品网站 | 97精品国产97久久久久久久久久久久 | 国产精品毛片久久久久久久久久99999999 | 国产精品视频地址 | 亚洲精品国精品久久99热一 | 国产亚洲精品中文字幕 | 久久免费美女视频 | 在线岛国av| 免费观看十分钟 | 日韩一区在线免费观看 | 亚洲国产日韩一区 | 丁香九月激情综合 | 99视频在线免费 | 婷婷色影院| 色激情五月 | 亚洲视频综合在线 | 国产精品久久久久久久久久久久午夜片 | 91自拍视频在线观看 | 欧美激精品 | 蜜臀av麻豆 | 欧美电影黄色 | 国产黄色一级片在线 | 久久精品亚洲 | 午夜黄网 | 高清美女视频 | 182午夜在线观看 | 国产99久久久久 | 久久久精品国产免费观看同学 | 亚洲午夜精品久久久久久久久久久久 | 成人久久久久久久久 | 天天干天天操天天拍 | 精品久久久99 | 亚州av网站 | 国产二区av | 色吊丝在线永久观看最新版本 | 精品91在线| 丁香婷婷色综合亚洲电影 | 国产在线精品国自产拍影院 | 91高清视频 | 高清视频一区二区三区 | 欧美日韩国产伦理 | 91精彩视频 | 美女网站一区 | 午夜精品福利在线 | 日韩在线观看视频免费 | 亚洲精品综合一二三区在线观看 | 69国产精品视频 | 久久精品中文字幕 | 国产精品美女毛片真酒店 | 亚洲国产成人在线观看 | 久久乐九色婷婷综合色狠狠182 | 精品国产电影 | 国产精品视频永久免费播放 | av高清一区二区三区 | 国产精品免费观看国产网曝瓜 | 综合久久网站 | 国产精品18久久久久久首页狼 | 日本中文字幕高清 | 蜜臀av夜夜澡人人爽人人 | 国产精品女同一区二区三区久久夜 | 久久视频网址 | 夜夜夜影院 | 久久精品99精品国产香蕉 | 亚洲四虎| 亚洲 综合 精品 | 色播五月婷婷 | 黄色性av| japanesexxx乱女另类| 久久久亚洲精华液 | 成人毛片a | av网站免费线看精品 | 中文字幕日本在线观看 | 麻豆视频在线 | 日韩理论电影在线观看 | 欧美日韩一级视频 | 久久精品96| 91视频88av | 精品亚洲成a人在线观看 | 能在线观看的日韩av | 欧美日韩不卡在线观看 | 国产视频久久 | 欧洲一区二区三区精品 | 国产亚洲视频在线免费观看 | 免费影视大全推荐 | 久久九九国产精品 | 超碰在线公开 | 久久久九色精品国产一区二区三区 | 午夜精品一区二区三区可下载 | 99久久成人| 亚洲伊人色 | 天天躁日日躁狠狠躁av麻豆 | www国产亚洲 | 国产精品不卡在线观看 | 亚洲黄色免费电影 | 亚洲日本精品视频 | 欧美日韩精品在线观看视频 | 在线观看日本韩国电影 | 欧美另类交在线观看 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 国产中文字幕免费 | 国产高清久久 | 精品一区电影 | 久草在线视频国产 | 99久久精品免费看 | 一级黄色免费网站 | 青青河边草手机免费 | 中文字幕在线精品 | 久久综合狠狠综合 | 99久久婷婷国产综合精品 | 成人黄色电影在线播放 | 最近2019年日本中文免费字幕 | 婷婷丁香九月 | 久久不卡视频 | 天天艹天天爽 | 黄色大全免费观看 | 黄av资源 | 国产午夜视频在线观看 | 国产精品久久久久亚洲影视 | 91精品国产91久久久久 | 国内精品久久久久久久影视简单 | 欧美 日韩 国产 成人 在线 | 激情五月婷婷综合 | 五月综合婷 | 国产精品久久久久久久久久新婚 | 亚洲精品中文字幕在线 | 超碰在线1| 精品在线视频播放 | 在线观看av免费 |