2012-05-29 52 views
2

任何人都知道如何從DLFileEntry檢索contentStream(http://docs.liferay.com/portal/6.0/javadocs/com/liferay/portlet/documentlibrary/model/DLFileEntry.html )使用一個httpservlet?Liferay從fileentry到java文件對象

我嘗試使用DLFileEntry.getContentStream()但它不能給我的錯誤

com.liferay.portal.security.auth.PrincipalException: PermissionChecker not initialized 

我部分解決了這個問題設置硬編碼我的用戶名:

long userId=2 

      PrincipalThreadLocal.setName(userId); 

      User user = UserLocalServiceUtil.getUserById(userId); 

      PermissionChecker permissionChecker; 

       permissionChecker = PermissionCheckerFactoryUtil.create(user, false); 

      PermissionThreadLocal.setPermissionChecker(permissionChecker); 

這種解決方案的問題是如何獲得真正的userId,以及如果用戶是來賓,會發生什麼?

我試過Long.parseLong(req.getRemoteUser());但也失敗了。

+0

您可以添加關於如何將DLFileEntry委派給FileEntryAdapter的代碼? – David

+0

您是否試圖通過服務訪問此文檔庫?你還使用什麼版本的Liferay? – Jonny

+0

liferay版本6.1 – Sabrina

回答

0

如果您使用的是Liferay 6.1,那麼以下代碼將爲您提供一個用於該DLFileEntry的InputStream。

InputStream inputStream = DLFileEntryLocalServiceUtil.getFileAsStream(fileEntry.getUserId(), fileEntry.getFileEntryId(), fileEntry.getVersion()); 

Howwever你得到的是錯誤似乎是因爲你沒有在進行此調用服務器之前用Liferay的認證。

你是怎麼調用這段代碼的?

+0

是的,在通話過程中,其Liferay給我的PermissionChecker錯誤.. – Sabrina

+0

但你怎麼調用這個代碼?在一個portlet中?運行它的用戶是登錄還是來賓?它是否被外部訪問?我從來不需要使用PermissionCheck來完成上述操作,但它確實需要服務上下文來獲取DLFileEntry。 – Jonny

+0

我創建一個servlet來下載壓縮文件,它的工作原理,但我需要在代碼中設置我的用戶的權限..我認爲是很奇怪的.. – Sabrina

2
DLFileEntryLocalServiceUtil.getFile(userId, fileEntryId, version, incrementCounter) 

給你的文件。你試過用這個嗎?

-Ravi

+0

如果你的DocumentLibrary實現支持它,這隻會給你這個文件。我知道S3&JCR不支持這種方法,如果你嘗試在Liferay 6.1中使用它,它會拋出「Unsupported Operation Exceptions」。 – Jonny

0

請使用PermissionThreadLocal.getPermissionChecker()來獲取登錄的用戶與當前狀態的電流下的PermissionChecker對象。如果用戶是來賓,仍然會得到permissionChecker對象。

-Felix

+0

嗨費利克斯,我很抱歉,但你的解決方案不起作用,它仍然會給出相同的錯誤.. – Sabrina

+0

嗨Sabrina,我建議你使用PortletServlet而不是HttpServlet,當你使用PortletServlet時,你將有一個portlet上下文,並從那裏獲取Portlet請求,Portlet會話以及希望的權限檢查器部分。 –