package org.pentaho.platform.web.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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.engine.core.system.PentahoSystem; import org.pentaho.platform.util.UUIDUtil; import org.pentaho.platform.web.servlet.messages.Messages; import org.safehaus.uuid.UUID; public class UploadFileServlet 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 = 3000000; 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 static final String CSV_EXT = ".csv"; //$NON-NLS-1$ public static final String EXCEL_EXT = ".excel"; //$NON-NLS-1$ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // Retrieving the file upload defaults from pentaho.xml 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$ response.setContentType("text/plain"); FileItem uploadItem = getFileItem(request); if (uploadItem == null) { response.getWriter().write(Messages.getInstance().getErrorString("UploadFileServlet.ERROR_0001_NO_FILE_TO_UPLOAD")); return; } if(Long.parseLong(maxFileLimit) < uploadItem.getSize()) { response.getWriter().write(Messages.getInstance().getErrorString("UploadFileServlet.ERROR_0003_FILE_TOO_BIG")); 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(pathDir) > Long.parseLong(maxFolderLimit)) { response.getWriter().write(Messages.getInstance().getErrorString("UploadFileServlet.ERROR_0004_FOLDER_SIZE_LIMIT_REACHED")); return; } byte[] fileContents = uploadItem.get(); UUID id = UUIDUtil.getUUID(); String filename = id.toString() + CSV_EXT; if(doesFileExists(new File(path+filename))) { response.getWriter().write(Messages.getInstance().getErrorString("UploadFileServlet.ERROR_0002_FILE_ALREADY_EXIST")); return; } FileOutputStream outputStream = new FileOutputStream(path+filename); outputStream.write(fileContents); outputStream.flush(); outputStream.close(); response.getWriter().write(new String(filename)); } catch(Exception e) { response.getWriter().write(Messages.getInstance().getErrorString("UploadFileServlet.ERROR_0005_UNKNOWN_ERROR",e.getLocalizedMessage())); } } 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())) { 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; } private boolean doesFileExists(File file) { return file.exists(); } }