2 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
4 * This library is free software; you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License as published by the Free
6 * Software Foundation; either version 2.1 of the License, or (at your option)
9 * This library is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
15 package com.liferay.portlet.documentlibrary.action;
17 import java.awt.image.RenderedImage;
18 import java.io.ByteArrayInputStream;
19 import java.io.ByteArrayOutputStream;
21 import java.io.FileInputStream;
22 import java.io.IOException;
23 import java.io.InputStream;
25 import javax.imageio.ImageIO;
26 import javax.portlet.ActionRequest;
27 import javax.portlet.ActionResponse;
28 import javax.portlet.PortletConfig;
29 import javax.servlet.ServletException;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
33 import org.apache.struts.action.ActionForm;
34 import org.apache.struts.action.ActionForward;
35 import org.apache.struts.action.ActionMapping;
37 import com.liferay.portal.kernel.image.ImageToolUtil;
38 import com.liferay.portal.kernel.repository.model.FileEntry;
39 import com.liferay.portal.kernel.repository.model.FileVersion;
40 import com.liferay.portal.kernel.log.Log;
41 import com.liferay.portal.kernel.log.LogFactoryUtil;
42 import com.liferay.portal.kernel.util.Base64;
43 import com.liferay.portal.kernel.util.FileUtil;
44 import com.liferay.portal.kernel.util.HttpUtil;
45 import com.liferay.portal.kernel.util.MimeTypesOverrideUtil;
46 import com.liferay.portal.kernel.util.ParamUtil;
47 import com.liferay.portal.kernel.util.StringPool;
48 import com.liferay.portal.kernel.util.SystemProperties;
49 import com.liferay.portal.kernel.util.Validator;
50 import com.liferay.portal.model.User;
51 import com.liferay.portal.security.auth.PrincipalException;
52 import com.liferay.portal.security.permission.PermissionChecker;
53 import com.liferay.portal.service.UserLocalServiceUtil;
54 import com.liferay.portal.struts.ActionConstants;
55 import com.liferay.portal.struts.PortletAction;
56 import com.liferay.portal.theme.ThemeDisplay;
57 import com.liferay.portal.util.Portal;
58 import com.liferay.portal.util.PortalUtil;
59 import com.liferay.portal.util.WebKeys;
60 import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
61 import com.liferay.portlet.documentlibrary.conversion.util.ENTDocumentConversionServiceUtil;
62 import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
63 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
64 import com.pentila.entSavoie.servlet.FLVPseudoStreamer;
65 import com.pentila.entSavoie.servlet.ServletResponseServiceUtil;
66 import com.pentila.entSavoie.utils.ENTMainUtilsLocalServiceUtil;
69 * @author Brian Wing Shun Chan
70 * @author Jorge Ferrer
72 * @author Bruno Farache
74 public class GetFileAction extends PortletAction {
77 public void processAction(
78 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
79 ActionRequest actionRequest, ActionResponse actionResponse)
81 HttpServletRequest request = PortalUtil.getHttpServletRequest(
83 HttpServletResponse response = PortalUtil.getHttpServletResponse(
87 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
89 long folderId = ParamUtil.getLong(actionRequest, "folderId");
90 String title = ParamUtil.getString(actionRequest, "title");
91 String version = ParamUtil.getString(actionRequest, "version");
93 long fileShortcutId = ParamUtil.getLong(
94 actionRequest, "fileShortcutId");
96 String uuid = ParamUtil.getString(actionRequest, "uuid");
98 String targetExtension = ParamUtil.getString(
99 actionRequest, "targetExtension");
101 String forceContentDisposition = ParamUtil.getString(request, "contentDispo");
103 boolean imageThumbnail = ParamUtil.getBoolean(request, "imageThumbnail", false);
105 ThemeDisplay themeDisplay =
106 (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
108 long groupId = ParamUtil.getLong(
109 actionRequest, "groupId", 0);
113 groupId = DLAppLocalServiceUtil.getFolder(folderId).getGroupId();
116 groupId = themeDisplay.getScopeGroupId();
122 fileEntryId, folderId, title, version, fileShortcutId, uuid,
123 groupId, targetExtension, forceContentDisposition, themeDisplay, request, response);
127 fileEntryId, folderId, title, version, fileShortcutId, uuid,
128 groupId, targetExtension, forceContentDisposition, themeDisplay, request, response);
131 setForward(actionRequest, ActionConstants.COMMON_NULL);
133 catch (NoSuchFileEntryException nsfee) {
134 PortalUtil.sendError(
135 HttpServletResponse.SC_NOT_FOUND, nsfee, actionRequest,
138 catch (PrincipalException pe) {
139 processPrincipalException(pe, request, response);
141 catch (Exception e) {
142 PortalUtil.sendError(e, actionRequest, actionResponse);
147 public ActionForward strutsExecute(
148 ActionMapping mapping, ActionForm form, HttpServletRequest request,
149 HttpServletResponse response)
152 long fileEntryId = ParamUtil.getLong(request, "fileEntryId");
154 long folderId = ParamUtil.getLong(request, "folderId");
155 String title = ParamUtil.getString(request, "title");
156 String version = ParamUtil.getString(request, "version");
158 long fileShortcutId = ParamUtil.getLong(request, "fileShortcutId");
160 String uuid = ParamUtil.getString(request, "uuid");
162 String forceContentDisposition = ParamUtil.getString(request, "contentDispo");
164 boolean imageThumbnail = ParamUtil.getBoolean(request, "imageThumbnail", false);
166 String targetExtension = ParamUtil.getString(
167 request, "targetExtension");
169 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
170 WebKeys.THEME_DISPLAY);
172 long groupId = ParamUtil.getLong(
173 request, "groupId", 0);
177 groupId = DLAppLocalServiceUtil.getFolder(folderId).getGroupId();
180 groupId = themeDisplay.getScopeGroupId();
186 fileEntryId, folderId, title, version, fileShortcutId, uuid,
187 groupId, targetExtension, forceContentDisposition, themeDisplay, request, response);
191 fileEntryId, folderId, title, version, fileShortcutId, uuid,
192 groupId, targetExtension, forceContentDisposition, themeDisplay, request, response);
197 catch (PrincipalException pe) {
198 processPrincipalException(pe, request, response);
202 catch (Exception e) {
203 PortalUtil.sendError(e, request, response);
209 protected void imageThumbnailFile(
210 long fileEntryId, long folderId, String title, String version,
211 long fileShortcutId, String uuid, long groupId,
212 String targetExtension, String forceContentDisposition, ThemeDisplay themeDisplay,
213 HttpServletRequest request, HttpServletResponse response)
216 InputStream is = null;
220 FileEntry fileEntry = null;
222 if (Validator.isNotNull(uuid) && (groupId > 0)) {
223 fileEntry = DLAppLocalServiceUtil.getFileEntryByUuidAndGroupId(
226 folderId = fileEntry.getFolderId();
229 if (fileEntryId > 0) {
230 fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
232 else if (fileShortcutId <= 0) {
233 if (Validator.isNotNull(title)) {
234 fileEntry = DLAppLocalServiceUtil.getFileEntry(
235 groupId, folderId, title);
239 DLFileShortcut fileShortcut = DLAppLocalServiceUtil.getFileShortcut(
242 fileEntryId = fileShortcut.getToFileEntryId();
244 fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
247 if (Validator.isNull(version)) {
248 if (Validator.isNotNull(fileEntry.getVersion())) {
249 version = fileEntry.getVersion();
252 throw new NoSuchFileEntryException();
256 FileVersion fileVersion = fileEntry.getFileVersion(version);
258 is = fileVersion.getContentStream(true);
260 tmpFile = FileUtil.createTempFile();
261 FileUtil.write(tmpFile, is);
263 RenderedImage renderedImage = ImageToolUtil.read(tmpFile).getRenderedImage();
264 RenderedImage thumbnail = ImageToolUtil.scale(renderedImage, 64, 64);
266 ByteArrayOutputStream bam = new ByteArrayOutputStream();
268 ImageIO.write(thumbnail, "png", bam);
270 String fileName = fileEntry.getTitle() + ".png";
272 String contentType = "image/png";
273 fileName = convertNonAscii(fileName);
275 ServletResponseServiceUtil.sendFile(
276 response, fileName, bam.toByteArray(), contentType, forceContentDisposition);
280 ServletResponseServiceUtil.cleanUp(is);
281 if (tmpFile != null) {
288 protected void getFile(
289 long fileEntryId, long folderId, String title, String version,
290 long fileShortcutId, String uuid, long groupId,
291 String targetExtension, String forceContentDisposition, ThemeDisplay themeDisplay,
292 HttpServletRequest request, HttpServletResponse response)
295 InputStream is = null;
296 InputStream convertedIS = null;
299 long companyId = themeDisplay.getCompanyId();
301 FileEntry fileEntry = null;
303 if (Validator.isNotNull(uuid) && (groupId > 0)) {
304 fileEntry = DLAppLocalServiceUtil.getFileEntryByUuidAndGroupId(
307 folderId = fileEntry.getFolderId();
310 if (fileEntryId > 0) {
311 fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
313 else if (fileShortcutId <= 0) {
314 if (Validator.isNotNull(title)) {
315 fileEntry = DLAppLocalServiceUtil.getFileEntry(
316 groupId, folderId, title);
320 DLFileShortcut fileShortcut = DLAppLocalServiceUtil.getFileShortcut(
323 fileEntryId = fileShortcut.getToFileEntryId();
325 fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
328 boolean versionized = true;
329 if (Validator.isNull(version)) {
330 if (Validator.isNotNull(fileEntry.getVersion())) {
331 version = fileEntry.getVersion();
335 throw new NoSuchFileEntryException();
339 FileVersion fileVersion = fileEntry.getFileVersion(version);
341 String fileName = fileVersion.getTitle();
342 String fileExtension = fileEntry.getExtension();
343 int contentLength = (int) fileVersion.getSize();
344 String contentType = fileVersion.getMimeType();
346 boolean converted = false;
347 if (Validator.isNotNull(targetExtension)) {
348 InputStream isForId = fileVersion.getContentStream(true);
350 String idSecure = ENTDocumentConversionServiceUtil.getFileChecksum(isForId);
353 InputStream isToConvert = fileVersion.getContentStream(true);
355 String sourceExtension = fileExtension;
357 File file = ENTDocumentConversionServiceUtil.convert(
358 idSecure, isToConvert, sourceExtension, targetExtension);
360 convertedIS = new FileInputStream(file);
361 contentLength = (int) file.length();
362 if ((convertedIS != null) && (convertedIS != isToConvert)) {
363 StringBuilder sb = new StringBuilder();
365 sb.append(fileEntry.getTitle());
366 sb.append(StringPool.PERIOD);
367 sb.append(targetExtension);
369 fileName = sb.toString();
374 } catch (Exception e){
375 _log.error("Fail to convert " + fileName + " (id="+fileEntryId+") to target extenstion " + targetExtension, e);
381 is = fileVersion.getContentStream(true);
382 contentLength = (int) fileVersion.getSize();
385 fileName = convertNonAscii(fileName);
387 if (!converted && !versionized && contentLength==0) {
388 // on a ici un probleme avec la taille des fichiers si on a demande une version paticuliere donc on zappe
389 contentLength = (int)fileEntry.getSize();
392 contentType = MimeTypesOverrideUtil.getContentType(fileName);
394 if (fileName.endsWith("mp4")) {
395 contentType="video/mp4";
396 } else if (fileName.endsWith("mp3")) {
397 contentType="audio/mp3";
400 String ppos = request.getParameter("start");
401 long pos = ppos == null || ppos.length() == 0 ? 0 : Long.parseLong(ppos);
403 String fcd = forceContentDisposition == null ? "" : forceContentDisposition;
405 ServletResponseServiceUtil.sendFile(
406 response, fileName, is, contentLength, contentType, fcd);
409 ServletResponseServiceUtil.cleanUp(is);
410 if (convertedIS!=null) {
416 private static final String PLAIN_ASCII =
417 "AaEeIiOoUu" // grave
418 + "AaEeIiOoUuYy" // acute
419 + "AaEeIiOoUuYy" // circumflex
421 + "AaEeIiOoUuYy" // umlaut
424 + "OoUu" // double acute
427 private static final String UNICODE =
428 "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"
429 + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD"
430 + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177"
431 + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
432 + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF"
435 + "\u0150\u0151\u0170\u0171"
438 // remove accentued from a string and replace with ascii equivalent
439 public static String convertNonAscii(String s) {
440 if (s == null) return null;
441 StringBuilder sb = new StringBuilder();
443 for (int i = 0; i < n; i++) {
444 char c = s.charAt(i);
445 int pos = UNICODE.indexOf(c);
447 sb.append(PLAIN_ASCII.charAt(pos));
453 return sb.toString();
457 protected boolean isCheckMethodOnProcessAction() {
458 return _CHECK_METHOD_ON_PROCESS_ACTION;
461 protected void processPrincipalException(
462 Throwable t, HttpServletRequest request,
463 HttpServletResponse response)
464 throws IOException, ServletException {
466 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
467 WebKeys.THEME_DISPLAY);
469 PermissionChecker permissionChecker =
470 themeDisplay.getPermissionChecker();
472 long userId = permissionChecker.getUserId();
477 user = UserLocalServiceUtil.getUser(userId);
479 catch (Exception e) {
482 if ((user != null) && !user.isDefaultUser()) {
483 PortalUtil.sendError(
484 HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
491 request.getContextPath() + Portal.PATH_MAIN + "/portal/login";
493 String currentURL = PortalUtil.getCurrentURL(request);
495 redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
497 response.sendRedirect(redirect);
500 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
502 private static Log _log = LogFactoryUtil.getLog(GetFileAction.class);