com.liferay.portal.kernel.upload.BaseUploadHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com.liferay.portal.kernel Show documentation
Show all versions of com.liferay.portal.kernel Show documentation
Contains interfaces for the portal services. Interfaces are only loaded by the global class loader and are shared by all plugins.
/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.upload;
import com.liferay.document.library.kernel.antivirus.AntivirusScannerException;
import com.liferay.document.library.kernel.exception.FileNameException;
import com.liferay.document.library.kernel.exception.FileSizeException;
import com.liferay.portal.kernel.editor.EditorConstants;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.portlet.JSONPortletResponseUtil;
import com.liferay.portal.kernel.portletfilerepository.PortletFileRepositoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.servlet.ServletResponseConstants;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StreamUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.WebKeys;
import java.io.IOException;
import java.io.InputStream;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
/**
* @author Sergio González
* @author Adolfo Pérez
* @author Roberto Díaz
*/
public abstract class BaseUploadHandler implements UploadHandler {
@Override
public void upload(
PortletRequest portletRequest, PortletResponse portletResponse)
throws PortalException {
UploadPortletRequest uploadPortletRequest =
PortalUtil.getUploadPortletRequest(portletRequest);
ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);
checkPermission(
themeDisplay.getScopeGroupId(), getFolderId(uploadPortletRequest),
themeDisplay.getPermissionChecker());
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
try {
UploadException uploadException =
(UploadException)portletRequest.getAttribute(
WebKeys.UPLOAD_EXCEPTION);
if (uploadException != null) {
Throwable cause = uploadException.getCause();
if (uploadException.isExceededFileSizeLimit()) {
throw new FileSizeException(cause);
}
if (uploadException.isExceededLiferayFileItemSizeLimit()) {
throw new LiferayFileItemException(cause);
}
if (uploadException.isExceededUploadRequestSizeLimit()) {
throw new UploadRequestSizeException(cause);
}
throw new PortalException(cause);
}
JSONObject imageJSONObject = getImageJSONObject(portletRequest);
String randomId = ParamUtil.getString(
uploadPortletRequest, "randomId");
imageJSONObject.put("randomId", randomId);
jsonObject.put("file", imageJSONObject);
jsonObject.put("success", Boolean.TRUE);
JSONPortletResponseUtil.writeJSON(
portletRequest, portletResponse, jsonObject);
}
catch (IOException ioe) {
throw new SystemException(ioe);
}
catch (PortalException pe) {
handleUploadException(
portletRequest, portletResponse, pe, jsonObject);
}
}
protected abstract FileEntry addFileEntry(
long userId, long groupId, long folderId, String fileName,
String contentType, InputStream inputStream, long size,
ServiceContext serviceContext)
throws PortalException;
protected abstract void checkPermission(
long groupId, long folderId, PermissionChecker permissionChecker)
throws PortalException;
protected void doHandleUploadException(
PortletRequest portletRequest, PortletResponse portletResponse,
PortalException pe, JSONObject jsonObject)
throws PortalException {
throw pe;
}
protected abstract FileEntry fetchFileEntry(
long userId, long groupId, long folderId, String fileName)
throws PortalException;
protected long getFolderId(UploadPortletRequest uploadPortletRequest) {
return 0;
}
protected JSONObject getImageJSONObject(PortletRequest portletRequest)
throws PortalException {
UploadPortletRequest uploadPortletRequest =
PortalUtil.getUploadPortletRequest(portletRequest);
ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);
JSONObject imageJSONObject = JSONFactoryUtil.createJSONObject();
InputStream inputStream = null;
try {
imageJSONObject.put(
"attributeDataImageId",
EditorConstants.ATTRIBUTE_DATA_IMAGE_ID);
String parameterName = getParameterName();
String fileName = uploadPortletRequest.getFileName(parameterName);
String contentType = uploadPortletRequest.getContentType(
parameterName);
long size = uploadPortletRequest.getSize(parameterName);
validateFile(fileName, contentType, size);
long folderId = getFolderId(uploadPortletRequest);
String uniqueFileName = getUniqueFileName(
themeDisplay, fileName, folderId);
inputStream = uploadPortletRequest.getFileAsStream(parameterName);
FileEntry fileEntry = addFileEntry(
themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
folderId, uniqueFileName, contentType, inputStream, size,
getServiceContext(uploadPortletRequest));
imageJSONObject.put("fileEntryId", fileEntry.getFileEntryId());
imageJSONObject.put("groupId", fileEntry.getGroupId());
imageJSONObject.put("title", fileEntry.getTitle());
imageJSONObject.put("type", "document");
imageJSONObject.put("url", getURL(fileEntry, themeDisplay));
imageJSONObject.put("uuid", fileEntry.getUuid());
return imageJSONObject;
}
catch (IOException ioe) {
throw new SystemException(ioe);
}
finally {
StreamUtil.cleanUp(inputStream);
}
}
protected abstract String getParameterName();
/**
* @throws PortalException
*/
protected ServiceContext getServiceContext(
UploadPortletRequest uploadPortletRequest)
throws PortalException {
return null;
}
protected String getUniqueFileName(
ThemeDisplay themeDisplay, String fileName, long folderId)
throws PortalException {
FileEntry fileEntry = fetchFileEntry(
themeDisplay.getUserId(), themeDisplay.getScopeGroupId(), folderId,
fileName);
if (fileEntry == null) {
return fileName;
}
int suffix = 1;
for (int i = 0; i < _UNIQUE_FILE_NAME_TRIES; i++) {
String curFileName = FileUtil.appendParentheticalSuffix(
fileName, String.valueOf(suffix));
fileEntry = fetchFileEntry(
themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
folderId, curFileName);
if (fileEntry == null) {
return curFileName;
}
suffix++;
}
throw new PortalException(
"Unable to get a unique file name for " + fileName);
}
protected String getURL(FileEntry fileEntry, ThemeDisplay themeDisplay) {
return PortletFileRepositoryUtil.getPortletFileEntryURL(
themeDisplay, fileEntry, StringPool.BLANK);
}
protected void handleUploadException(
PortletRequest portletRequest, PortletResponse portletResponse,
PortalException pe, JSONObject jsonObject)
throws PortalException {
jsonObject.put("success", Boolean.FALSE);
if (pe instanceof AntivirusScannerException ||
pe instanceof FileNameException ||
pe instanceof FileSizeException ||
pe instanceof UploadRequestSizeException) {
String errorMessage = StringPool.BLANK;
int errorType = 0;
ThemeDisplay themeDisplay =
(ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);
if (pe instanceof AntivirusScannerException) {
errorType =
ServletResponseConstants.SC_FILE_ANTIVIRUS_EXCEPTION;
AntivirusScannerException ase = (AntivirusScannerException)pe;
errorMessage = themeDisplay.translate(ase.getMessageKey());
}
else if (pe instanceof FileNameException) {
errorType = ServletResponseConstants.SC_FILE_NAME_EXCEPTION;
}
else if (pe instanceof FileSizeException) {
errorType = ServletResponseConstants.SC_FILE_SIZE_EXCEPTION;
}
else if (pe instanceof UploadRequestSizeException) {
errorType =
ServletResponseConstants.SC_UPLOAD_REQUEST_SIZE_EXCEPTION;
}
JSONObject errorJSONObject = JSONFactoryUtil.createJSONObject();
errorJSONObject.put("errorType", errorType);
errorJSONObject.put("message", errorMessage);
jsonObject.put("error", errorJSONObject);
}
else {
doHandleUploadException(
portletRequest, portletResponse, pe, jsonObject);
}
try {
JSONPortletResponseUtil.writeJSON(
portletRequest, portletResponse, jsonObject);
}
catch (IOException ioe) {
throw new SystemException(ioe);
}
}
protected abstract void validateFile(
String fileName, String contentType, long size)
throws PortalException;
protected static final String TEMP_FOLDER_NAME =
BaseUploadHandler.class.getName();
private static final int _UNIQUE_FILE_NAME_TRIES = 50;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy