DiskMultiPartRequestHandler.java
package sk.iway.upload;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import sk.iway.iwcm.IwcmRequest;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.RequestBean;
import sk.iway.iwcm.SetCharacterEncodingFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletException;
/**
* Nahrada za org.apache.struts.upload.DiskMultipartRequestHandler, do konfigu
* strutsu ho treba nastavit:
* Do web.xml, do inicializacie action
* <init-param>
* <param-name>multipartClass</param-name>
* <param-value>sk.iway.upload.DiskMultiPartRequestHandler</param-value>
* </init-param>
*
* Na to aby to fungovalo, treba do formularu doplnit volanie popup okna s
* progresom uploadu:
* <form ... onsubmit="showUploadProgressBar()">
*
*@Title magma-web
*@Company Interway s.r.o. (www.interway.sk)
*@Copyright Interway s.r.o. (c) 2001-2002
*@author $Author: jeeff $
*@version $Revision: 1.1 $
*@created Sobota, 2003, október 25
*@modified $Date: 2003/10/27 07:44:55 $
*/
public class DiskMultiPartRequestHandler
{
private List<FileItem> files;
/**
* kopia triedy z originalneho balika, pouziva vsak nas MultipartIterator
*
*@param request Description of the Parameter
*@exception ServletException Description of the Exception
* @throws FileUploadException
* @throws UnsupportedEncodingException
*/
public HttpServletRequest handleRequest(HttpServletRequest request) throws ServletException, FileUploadException, UnsupportedEncodingException
{
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
files = upload.parseRequest(request);
if (files != null) Logger.debug(DiskMultiPartRequestHandler.class, "DiskMultiPartRequestHandler.handleRequest, files="+files.size());
IwcmRequest wrapped = new IwcmRequest(request);
if (files != null)
{
Map<String, List<String>> paramsTable = new Hashtable<>();
for (FileItem item : files)
{
DiskFileItem diskFile = ((DiskFileItem)item);
if (diskFile.isFormField())
{
Logger.debug(DiskMultiPartRequestHandler.class, "name="+diskFile.getFieldName()+" value="+diskFile.getString(SetCharacterEncodingFilter.getEncoding())+" isFormField="+diskFile.isFormField()+" inMemory="+diskFile.isInMemory());
}
else
{
Logger.debug(DiskMultiPartRequestHandler.class, "name="+diskFile.getFieldName()+" size="+diskFile.getSize()+" contentType="+diskFile.getContentType()+" isFormField="+diskFile.isFormField()+" inMemory="+diskFile.isInMemory());
}
if (!diskFile.isFormField() || diskFile.getString() == null) continue;
Logger.debug(DiskMultiPartRequestHandler.class, "setting");
String name = diskFile.getFieldName();
String value = diskFile.getString(SetCharacterEncodingFilter.getEncoding());
//aby nam fungovalo aj request.getParameterValues()
List<String> valuesList = paramsTable.get(name);
if (valuesList == null)
{
valuesList = new ArrayList<>();
paramsTable.put(name, valuesList);
}
valuesList.add(value);
}
Set<Map.Entry<String, List<String>>> paramSet = paramsTable.entrySet();
for (Map.Entry<String, List<String>> me : paramSet)
{
String name = me.getKey();
List<String> valueList = me.getValue();
if (valueList.size()<1) continue;
wrapped.setParameterValues(name, valueList.toArray(new String[0]));
}
}
//uloz parametre do request beanu, kedze tam su zatial prazdne
RequestBean rb = SetCharacterEncodingFilter.getCurrentRequestBean();
if (rb != null) {
rb.setParameters(wrapped.getParameterMap());
}
return wrapped;
}
public Map<String, UploadedFile> getFileElements()
{
Map<String, UploadedFile> items = new HashMap<>();
for (FileItem item : files)
{
DiskFileItem diskFile = ((DiskFileItem)item);
if (diskFile.isFormField()) continue;
items.put(diskFile.getFieldName(), new UploadedFile(diskFile));
}
return items;
}
public Map<String, List<UploadedFile>> getFileElementsMultiple()
{
Map<String, List<UploadedFile>> items = new HashMap<>();
for (FileItem item : files)
{
DiskFileItem diskFile = ((DiskFileItem)item);
if (diskFile.isFormField()) continue;
String key = diskFile.getFieldName();
List<UploadedFile> uploadedFiles = items.get(key);
if (uploadedFiles == null) {
uploadedFiles = new ArrayList<>();
items.put(key, uploadedFiles);
}
uploadedFiles.add(new UploadedFile(diskFile));
}
return items;
}
public void rollback()
{
for (FileItem item : files)
{
item.delete();
}
}
}