/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
* copyright 2003-2010 Akaza Research
*/
package org.akaza.openclinica.bean.rule;
import org.akaza.openclinica.exception.OpenClinicaSystemException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
public class FileUploadHelper {
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
FileProperties fileProperties;
FileRenamePolicy fileRenamePolicy;
public FileUploadHelper() {
fileProperties = new FileProperties();
}
public FileUploadHelper(FileProperties fileProperties) {
super();
this.fileProperties = fileProperties;
}
public List<File> returnFiles(HttpServletRequest request, ServletContext context) {
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
return isMultipart ? getFiles(request, context, null) : new ArrayList<File>();
}
public List<File> returnFiles(HttpServletRequest request, ServletContext context, FileRenamePolicy fileRenamePolicy) {
// Check that we have a file upload request
this.fileRenamePolicy = fileRenamePolicy;
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
return isMultipart ? getFiles(request, context, null) : new ArrayList<File>();
}
public List<File> returnFiles(HttpServletRequest request, ServletContext context, String dirToSaveUploadedFileIn, FileRenamePolicy fileRenamePolicy) {
// Check that we have a file upload request
this.fileRenamePolicy = fileRenamePolicy;
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
return isMultipart ? getFiles(request, context, createDirectoryIfDoesntExist(dirToSaveUploadedFileIn)) : new ArrayList<File>();
}
public List<File> returnFiles(HttpServletRequest request, ServletContext context, String dirToSaveUploadedFileIn) {
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
return isMultipart ? getFiles(request, context, createDirectoryIfDoesntExist(dirToSaveUploadedFileIn)) : new ArrayList<File>();
}
@SuppressWarnings("unchecked")
private List<File> getFiles(HttpServletRequest request, ServletContext context, String dirToSaveUploadedFileIn) {
List<File> files = new ArrayList<File>();
// FileCleaningTracker fileCleaningTracker =
// FileCleanerCleanup.getFileCleaningTracker(context);
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(getFileProperties().getFileSizeMax());
try {
// Parse the request
List<FileItem> items = upload.parseRequest(request);
// Process the uploaded items
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
request.setAttribute(item.getFieldName(), item.getString());
// DO NOTHING , THIS SHOULD NOT BE Handled here
} else {
getFileProperties().isValidExtension(item.getName());
files.add(processUploadedFile(item, dirToSaveUploadedFileIn));
}
}
return files;
}catch (FileSizeLimitExceededException slee) {
throw new OpenClinicaSystemException("exceeds_permitted_file_size", new Object[] { String.valueOf(getFileProperties().getFileSizeMaxInMb()) },
slee.getMessage());
}catch (FileUploadException fue) {
throw new OpenClinicaSystemException("file_upload_error_occured", new Object[] { fue.getMessage() }, fue.getMessage());
}
}
private File processUploadedFile(FileItem item, String dirToSaveUploadedFileIn) {
dirToSaveUploadedFileIn = dirToSaveUploadedFileIn == null ? System.getProperty("java.io.tmpdir") : dirToSaveUploadedFileIn;
String fileName = item.getName();
// Some browsers IE 6,7 getName returns the whole path
int startIndex = fileName.lastIndexOf('\\');
if (startIndex != -1) {
fileName = fileName.substring(startIndex + 1, fileName.length());
}
File uploadedFile = new File(dirToSaveUploadedFileIn + File.separator + fileName);
if (fileRenamePolicy != null) {
try {
uploadedFile = fileRenamePolicy.rename(uploadedFile, item.getInputStream());
} catch (IOException e) {
throw new OpenClinicaSystemException(e.getMessage());
}
}
try {
item.write(uploadedFile);
} catch (Exception e) {
throw new OpenClinicaSystemException(e.getMessage());
}
return uploadedFile;
}
private String createDirectoryIfDoesntExist(String theDir) {
if (!new File(theDir).isDirectory()) {
new File(theDir).mkdirs();
}
return new File(theDir).toString();
}
public FileProperties getFileProperties() {
return fileProperties;
}
public void setFileProperties(FileProperties fileProperties) {
this.fileProperties = fileProperties;
}
}