File Upload with processing in an Action
The code below is tested with Cocoon 2.03. Refer to the end of the page if you want to use it with Cocoon >= 2.1
Here's some sample code to demonstrate how to upload a file and do the processing of this in an Action.
Example of an upload form:
<html>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
File: <input type="file" name="uploadfile" size="50">
<input type="submit"/>
</form>
</body>
</html>Example of an Action to get the uploaded file
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.cocoon.acting.Action;
import org.apache.cocoon.environment.Redirector;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.components.request.multipart.FilePart;
import org.apache.cocoon.components.request.multipart.FilePartFile;
import java.util.Map;
import java.util.Collections;
import java.io.File;
public class UploadTest
extends AbstractLogEnabled
implements Action, ThreadSafe
{
public Map act(Redirector redirector, SourceResolver resolver,
Map objectModel, String source, Parameters par)
throws Exception
{
Request request = ObjectModelHelper.getRequest(objectModel);
FilePart filePart = (FilePart) request.get("uploaded_file");
File file = ((FilePartFile)filePart).getFile();
getLogger().debug("Uploaded file = " + file.getCanonicalPath());
// here you can open an InputStream on the file or whatever
// you may also want to delete the file after using it
return Collections.EMPTY_MAP;
}
}For concept and configuration information for file uploads see FileUploadsWithCocoon
Making it work on Cocoon 2.1
If you are using Cocoon >= 2.1, you'll have to change the following imports:
import org.apache.cocoon.components.request.multipart.FilePart; import org.apache.cocoon.components.request.multipart.FilePartFile;
to:
import org.apache.cocoon.servlet.multipart.Part; import org.apache.cocoon.servlet.multipart.PartOnDisk;
Consequently, the following lines
FilePart filePart = (FilePart) request.get("uploaded_file");
File file = ((FilePartFile)filePart).getFile();should read
Part filePart = (Part) request.get("uploaded_file");
File file = ((PartOnDisk)filePart).getFile();Warning, this won't work if the servlet container stores the uploaded file in memory (PartInMemory) instead of creating a temporary file (PartOnDisk).
Attachment: Database