Here is the Action I use. It is based on the example in the Cocoon Developer's Handbook.
Hopefully I copied and pasted it w/o error.
The sitemap would be:
in map:components section with the other actions: <map:action logger="sitemap.action.fileupload" name="fileupload" src="yourpackagenamehere.FileUploadAction" />
in your pipeline section <map:match pattern="do-upload"> <map:act type="request"> <map:parameter name="parameters" value="true" /> <map:act type="fileupload"> <map:parameter name="upload-dir" value="incoming" /> <map:generate src="success.xml"/> <map:serialize type="html"/> </map:act> <map:generate src="uploadfailed.xml" /> <map:serialize type="html" /> </map:act> </map:match>
HTH Steve
/**
* Upload a file into the directory specified in the <i>upload-dir</i> parameter.
* Based on code by Jeremy Aston from the Cocoon Developer's Handbook.
*/
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map;
import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.acting.AbstractConfigurableAction; import org.apache.cocoon.environment.Context; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Redirector; import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.SourceResolver; import org.apache.cocoon.servlet.multipart.Part; import org.apache.cocoon.servlet.multipart.PartOnDisk; import org.apache.cocoon.util.IOUtils;
public class FileUploadAction
extends AbstractConfigurableAction
implements ThreadSafe {
/** Name of the parameter that holds the upload directory name to use **/
private static final String UPLOAD_FOLDER_PARAMETER = "upload-dir";
/** * Put an upload file into directory specified as a parameter to * the action called <i>upload-dir</i> */ public Map act( Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception { Request request = ObjectModelHelper.getRequest(objectModel); Context context = ObjectModelHelper.getContext(objectModel);
HashMap results = new HashMap();
if (request != null) {
// Loop through the parameter names to find any file upload stuff
getLogger().debug("Request Parameters");
for (Enumeration e = request.getParameterNames();
e.hasMoreElements();) {
String param = (String)e.nextElement();
Object value = request.get(param);
getLogger().debug("["+ param + "] ["
+ value.getClass().getName() + "] : " + value);
if (value instanceof Part) {
// Have got a Part object (or sub class - hence the casting )
// Now get the filename and the real path to form the file route.
String filename = ((Part)value).getFileName();
String uploadFolder =
(String)parameters.getParameter(
UPLOAD_FOLDER_PARAMETER);
String realPath = context.getRealPath("/");
// Do a sanity check on the upload folder
if (uploadFolder == null || uploadFolder.length() == 0) {
getLogger().error("Missing "
+ UPLOAD_FOLDER_PARAMETER
+ " parameter or no upload folder specified in the "
+ UPLOAD_FOLDER_PARAMETER
+ " parameter");
return null;
}
// Concatenate the realPath folder to the upload folder
if (realPath != null) {
uploadFolder = realPath + uploadFolder;
}
getLogger().debug(
"Uploading " + filename + " to " + uploadFolder);
// Create the upload folder(s) if need be
File folder = new File(uploadFolder);
if (!folder.exists()) {
folder.mkdirs();
File destFile =
new File(folder + File.separator + filename);
// Check to see if the object is a PartOnDisk object as this can
// simply be renamed if it is on the same file system
if (value instanceof PartOnDisk) {
getLogger().debug("Renaming " + filename + " to " + destFile);
if (((PartOnDisk)value).getFile().renameTo(destFile)) {
getLogger().debug("Successfully renamed "
+ filename
+ " to "
+ destFile);
}
else {
// Maybe it's on a different filesystem...
if (copyFile(((Part)value).getInputStream(),
new FileOutputStream(destFile))) {
getLogger().debug("Successfully copied "
+ filename
+ " to "
+ destFile);
}
else {
getLogger().error("FAILED to rename/copy "
+ filename + " to " + destFile);
return null;
}
}
}
else {
getLogger().debug("Streaming file to " + destFile);
if (copyFile(((Part)value).getInputStream(),
new FileOutputStream(destFile))) {
getLogger().debug("Successfully copied stream to "
+ destFile);
}
else {
getLogger().error("FAILED to copy stream to "
+ destFile);
return null;
}
}
request.setAttribute("upload-file", filename);
getLogger().debug("Set upload-file to "
+ request.getAttribute("upload-file"));
}
else if (value instanceof String) {
getLogger().debug("Skipping parameter: " + (String)value);
}
else {
getLogger().debug("Skipping something else");
}
}
String contentType = request.getContentType(); getLogger().debug("Content Type: " + contentType);
}
return Collections.unmodifiableMap(results); }
private boolean copyFile(InputStream in, FileOutputStream out) { byte[] buffer = new byte[4096]; int read; try { read = in.read(buffer);
while (read > 0) { out.write(buffer, 0, read); read = in.read(buffer); } out.close(); } catch (IOException ex) { return false; } return true; }
}
Hi again Geoff...
I'm still trying to implement the code in order to upload files with cocoon.
I have readed wiki web a thousand times ... ;-) ..
_________________________________________________________________
Fretting that your Hotmail account may expire because you forgot to sign in enough? Get Hotmail Extra Storage today! http://join.msn.com/?PAGE=features/es
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]