/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program 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. * * Copyright 2008 - 2009 Pentaho Corporation. All rights reserved. * * * Created May 26, 2009 * @author rmansoor */ package org.pentaho.platform.dataaccess.datasource.wizard.service.impl; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.utils.PentahoSystemHelper; import org.pentaho.platform.dataaccess.datasource.wizard.service.messages.Messages; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.util.UUIDUtil; import org.pentaho.platform.web.http.PentahoHttpSessionHelper; import org.pentaho.reporting.libraries.base.util.StringUtils; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; public class UploadFileDebugServlet extends HttpServlet implements Servlet { private static final long serialVersionUID = 8305367618713715640L; private static final long MAX_FILE_SIZE = 300000; private static final long MAX_FOLDER_SIZE = 900000; public static final String DEFAULT_RELATIVE_UPLOAD_FILE_PATH = File.separatorChar + "system" + File.separatorChar + "metadata" + File.separatorChar + "csvfiles" + File.separatorChar; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ public UploadFileDebugServlet() { PentahoSystemHelper.init(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String relativePath = PentahoSystem.getSystemSetting("file-upload-defaults/relative-path", String.valueOf(DEFAULT_RELATIVE_UPLOAD_FILE_PATH)); //$NON-NLS-1$ String maxFileLimit = PentahoSystem.getSystemSetting("file-upload-defaults/max-file-limit", String.valueOf(MAX_FILE_SIZE)); //$NON-NLS-1$ String maxFolderLimit = PentahoSystem.getSystemSetting("file-upload-defaults/max-folder-limit", String.valueOf(MAX_FOLDER_SIZE)); //$NON-NLS-1$ IPentahoSession session = PentahoHttpSessionHelper.getPentahoSession(request); response.setContentType("text/plain"); //$NON-NLS-1$ FileItem uploadItem = getFileItem(request); if (uploadItem == null) { String error = Messages.getErrorString("UploadFileDebugServlet.ERROR_0001_NO_FILE_TO_UPLOAD"); //$NON-NLS-1$ response.getWriter().write(error); return; } if (Long.parseLong(maxFileLimit) < uploadItem.getSize()) { String error = Messages.getErrorString("UploadFileDebugServlet.ERROR_0003_FILE_TOO_BIG"); //$NON-NLS-1$ response.getWriter().write(error); return; } String path = PentahoSystem.getApplicationContext().getSolutionPath(relativePath); File pathDir = new File(path); // create the path if it doesn't exist yet if (!pathDir.exists()) { pathDir.mkdirs(); } if (uploadItem.getSize() + getFolderSize(new File(path)) > Long.parseLong(maxFolderLimit)) { String error = Messages.getErrorString("UploadFileDebugServlet.ERROR_0004_FOLDER_SIZE_LIMIT_REACHED"); //$NON-NLS-1$ response.getWriter().write(error); return; } String filename = request.getParameter("file_name"); //$NON-NLS-1$ if(StringUtils.isEmpty(filename)) { filename = UUIDUtil.getUUID().toString(); } String temporary = request.getParameter("mark_temporary"); //$NON-NLS-1$ boolean isTemporary = false; if(temporary != null) { isTemporary = Boolean.valueOf(temporary); } File file; if(isTemporary) { file = PentahoSystem.getApplicationContext().createTempFile(session, "",".tmp", true); //$NON-NLS-1$ } else { file = new File(path + File.separatorChar + filename); } FileOutputStream outputStream = new FileOutputStream(file); byte[] fileContents = uploadItem.get(); outputStream.write(fileContents); outputStream.flush(); outputStream.close(); response.getWriter().write(file.getName()); } catch (Exception e) { String error = Messages.getErrorString("UploadFileDebugServlet.ERROR_0005_UNKNOWN_ERROR", e.getLocalizedMessage()); //$NON-NLS-1$ response.getWriter().write(error); } } private FileItem getFileItem(HttpServletRequest request) { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List items = upload.parseRequest(request); Iterator it = items.iterator(); while (it.hasNext()) { FileItem item = (FileItem) it.next(); if (!item.isFormField() && "uploadFormElement".equals(item.getFieldName())) {//$NON-NLS-1$ return item; } } } catch (FileUploadException e) { return null; } return null; } private long getFolderSize(File folder) { long foldersize = 0; File[] filelist = folder.listFiles(); for (int i = 0; i < filelist.length; i++) { if (filelist[i].isDirectory()) { foldersize += getFolderSize(filelist[i]); } else { foldersize += filelist[i].length(); } } return foldersize; } }