/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
* Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.cms.util;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.infoglue.cms.applications.common.VisualFormatter;
import webwork.multipart.MultiPartRequestWrapper;
/**
* This is the action-class for UpdateDigitalAssetVersion
*
* @author Mattias Bogeblad
*/
public class FileUploadHelper
{
private final static Logger logger = Logger.getLogger(FileUploadHelper.class.getName());
private FileUploadHelper()
{
// don't instantiate, use static methods
}
/**
* Moves all files (i.e. all files returned by {@linkplain MultiPartRequestWrapper#getFileNames()})
* in the {@link MultiPartRequestWrapper} to InfoGlue's
* {@linkplain CmsPropertyHandler#getDigitalAssetUploadPath()}
* and returns a reference to the last file moved.
*
* The files are moved with {@link File#renameTo(File)} and if a file move fails a
* copy'n'delete action is tried instead. The copied file is kept even if the delete-file action fails.
* @param mpr The uploaded files will be retrieved from this object
* @return A reference to the file (at it's target location) that was moved last from the request.
*/
public static File getUploadedFile(MultiPartRequestWrapper mpr)
{
File renamedFile = null;
try
{
if(mpr != null)
{
Enumeration names = mpr.getFileNames();
while (names.hasMoreElements())
{
String name = (String)names.nextElement();
File file = mpr.getFile(name);
logger.info("file:" + file.getPath() + ":" + file.exists());
if(file != null)
{
String fileSystemName = mpr.getFilesystemName(name);
String fileName = "Import_" + System.currentTimeMillis() + fileSystemName;
fileName = new VisualFormatter().replaceNiceURINonAsciiWithSpecifiedChars(fileName, CmsPropertyHandler.getNiceURIDefaultReplacementCharacter());
String filePath = CmsPropertyHandler.getDigitalAssetUploadPath();
fileSystemName = filePath + File.separator + fileName;
logger.info("fileSystemName:" + fileSystemName);
renamedFile = new File(fileSystemName);
boolean isRenamed = file.renameTo(renamedFile);
if (logger.isInfoEnabled())
{
logger.info("rename file " + (isRenamed ? "succeeded" : "failed") + ": " + renamedFile.getPath() + " (target exists: " + renamedFile.exists() + ")");
}
if (!isRenamed)
{
logger.info("Trying to copy/delete file instead");
try
{
long start = System.currentTimeMillis();
FileUtils.copyFile(file, renamedFile);
long end = System.currentTimeMillis();
if (logger.isDebugEnabled())
{
logger.debug("File copy took " + (end - start) + " ms");
}
if (!file.delete())
{
logger.warn("File was copied but source could not be removed. Source: " + file.getPath());
}
else
{
logger.info("Copy/delete succeeded");
}
}
catch (IOException ex)
{
logger.info("Copy file failed. Message: " + ex.getMessage());
renamedFile = null;
}
}
}
}
}
else
{
logger.error("File upload failed for some reason.");
}
}
catch (Exception e)
{
logger.error("An error occurred when we get and rename an uploaded file:" + e.getMessage(), e);
}
return renamedFile;
}
/**
* Lists the files
*/
public static void listMultiPartFiles(HttpServletRequest req)
{
try
{
File tempDir = new File("c:/temp/uploads");
logger.info("tempDir:" + tempDir.exists());
DiskFileItemFactory factory = new DiskFileItemFactory(1000, tempDir);
ServletFileUpload upload = new ServletFileUpload(factory);
if(ServletFileUpload.isMultipartContent((HttpServletRequest)req))
{
List fileItems = upload.parseRequest((HttpServletRequest)req);
logger.info("******************************");
logger.info("fileItems:" + fileItems.size());
logger.info("******************************");
req.setAttribute("Test", "Mattias Testar");
Iterator i = fileItems.iterator();
while(i.hasNext())
{
Object o = i.next();
DiskFileItem dfi = (DiskFileItem)o;
logger.info("dfi:" + dfi.getFieldName());
logger.info("dfi:" + dfi);
if (!dfi.isFormField()) {
String fieldName = dfi.getFieldName();
String fileName = dfi.getName();
String contentType = dfi.getContentType();
boolean isInMemory = dfi.isInMemory();
long sizeInBytes = dfi.getSize();
logger.info("fieldName:" + fieldName);
logger.info("fileName:" + fileName);
logger.info("contentType:" + contentType);
logger.info("isInMemory:" + isInMemory);
logger.info("sizeInBytes:" + sizeInBytes);
File uploadedFile = new File("c:/temp/uploads/" + fileName);
dfi.write(uploadedFile);
req.setAttribute(dfi.getFieldName(), uploadedFile.getAbsolutePath());
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}