Hello Guys,
Liferay store files using media and document which is default functionality of liferay. Liferay support all type file.
Below code download files with zip folder using "FileEntryID".
NOTE : Liferay fully support to Oracle JDK.
Follow below steps to download files from media and document in liferay.
Step 1 : Create serveResource URL with fileEntryId parameter's.
Step 2 : Put below code in MVCPortlet class.
private static final String FILE_EXT_SEP = FilenameUtils.EXTENSION_SEPARATOR_STR;
private static final String ZIP_FILE_EXT_NAME = "zip";
private static final String ZIP_FILE_EXT = FILE_EXT_SEP + ZIP_FILE_EXT_NAME;
private static int DEFAULT_DL_FILE_DOWNLOAD_CACHE_MAX_AGE = 1;
@ProcessAction(name="serveResource")
public void serveResource(ResourceRequest resourceRequest,
ResourceResponse resourceResponse) throws IOException
{
UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(resourceRequest);
String files=(String)uploadRequest.getParameter("iFileEntryId");
String [] fileIdsArray = getFileIds(files);
logger.info("fileDownload "+fileIdsArray[0]);
if (null == fileIdsArray || files.isEmpty()) {
SessionErrors.add(resourceRequest, "Please Select File.");
resourceResponse.setProperty("portlet.http-status-code", "302");
resourceResponse.addProperty("Location", resourceResponse.createRenderURL().toString());
return;
}
setupResponseHeaders(resourceRequest, resourceResponse);
try {
downloadMultipleFilesInZip(resourceRequest, resourceResponse, fileIdsArray);
} catch (PortalException e) {
logger.debug("PortalException", e);
}
}
private String[] getFileIds(String fileEntryIds) {
String[] ids = fileEntryIds.split(",");
return ids;
}
private void setupResponseHeaders(ResourceRequest resourceRequest, ResourceResponse resourceResponse) {
String zipFileMimeType = "application/zip";
resourceResponse.setContentType(zipFileMimeType);
int multipleFileDownloadCacheMaxAge = DEFAULT_DL_FILE_DOWNLOAD_CACHE_MAX_AGE;
if (multipleFileDownloadCacheMaxAge > 0) {
String cacheControlValue = "max-age=" + multipleFileDownloadCacheMaxAge + ", must-revalidate";
resourceResponse.addProperty("Cache-Control", cacheControlValue);
}
String zipFileName = "ATTACHMENTS_" + new Date().getTime() + ZIP_FILE_EXT;
String contentDispositionValue = "attachment; filename=\"" + zipFileName + "\"";
logger.info("resourceResponse>>>> "+contentDispositionValue);
resourceResponse.addProperty("Content-Disposition", contentDispositionValue);
}
private void downloadMultipleFilesInZip(ResourceRequest resourceRequest, ResourceResponse resourceResponse, String[] fileIdsArray) throws PortalException {
try {
DownloadFilesZipHelper.exportMultipleFilesToZipFile( fileIdsArray, resourceResponse.getPortletOutputStream());
logger.info("resourceResponse.getPortletOutputStream() >>>> "+resourceResponse.getPortletOutputStream().toString());
} catch (Exception e) {
String msg = "Error downloading files " + e.getMessage();
logger.error(msg, e);
throw new PortalException(msg, e);
}
Step 3 : Create DownloadFilesZipHelper.java and put below code.
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.FilenameUtils;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.util.StreamUtil;
import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
import com.model.PatientEvents;
import com.service.PatientEventsLocalServiceUtil;
public class DownloadFilesZipHelper {
private static final Log log = LogFactoryUtil.getLog(DownloadFilesZipHelper.class);
public static void exportMultipleFilesToZipFile(String[] fileIdsArray, OutputStream outputStream) throws PortalException, SystemException, IOException{
List<FileEntry> filesList = getMultipleFiles(fileIdsArray);
if (!filesList.isEmpty()) {
exportMultipleFilesToOutputStream(filesList, outputStream);
}
}
public static List<FileEntry> getMultipleFiles(String[] fileIdsArray) throws PortalException, SystemException {
long fileEntryId;
List<FileEntry> fileEntryList = new ArrayList<FileEntry>();
for (String fileEntry : fileIdsArray) {
fileEntryId = Long.parseLong(fileEntry);
fileEntryList.add(DLAppServiceUtil.getFileEntry(fileEntryId));
}
return fileEntryList;
}
public static void exportMultipleFilesToOutputStream( List<FileEntry> filesList, OutputStream outputStream) throws IOException, PortalException, SystemException {
ZipOutputStream zipWriter = null;
try{
zipWriter = new ZipOutputStream(outputStream);
exportMultipleFilesToZipWriter( filesList, zipWriter);
}catch (Exception e) {
log.debug("Exception", e);
}finally{
if (zipWriter != null) {
zipWriter.close();
}
}
}
public static void exportMultipleFilesToZipWriter( List<FileEntry> filesList, ZipOutputStream zipOutputStream){
InputStream fileInputStream = null;
try {
for (FileEntry fileEntry : filesList) {
String zipEntryPath = buildZipEntryPath( fileEntry, "", zipOutputStream);
fileInputStream = fileEntry.getContentStream();
zipOutputStream.putNextEntry(new ZipEntry(zipEntryPath));
StreamUtil.transfer(fileInputStream, zipOutputStream, false);
}
} catch (Exception e) {
log.debug(e);
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
fileInputStream = null;
}
} catch (IOException e) {
log.debug("IOException", e);
}
}
}
private static String buildZipEntryPath( FileEntry fileEntry,
String folderPath, ZipOutputStream zipOutputStream) throws SystemException,
PortalException {
String fileEntryBaseName = fileEntry.getTitle();
fileEntryBaseName = FilenameUtils.getBaseName(fileEntryBaseName);
fileEntryBaseName = fileEntryBaseName.replaceAll("\\W+", "_");
String zipEntryName = folderPath + fileEntryBaseName + FilenameUtils.EXTENSION_SEPARATOR_STR + fileEntry.getExtension();
log.info("zipEntryName "+zipEntryName);
return zipEntryName;
}
}
1 Comment(s)