Hi Steve ... thanks for your help ... I have some doubts.
When I compile the action, I put it into a package, named
edu.uoc.riudavets, under /WEB-INF/classes directory...
I have applied next code into sitemap.xmap:
<map:action logger="sitemap.action.fileupload" name="fileupload"
src="edu.uoc.riudavets.FileUploadAction"/>
<map:pipeline>
<map:match pattern="do-upload">
<map:act type="fileupload">
<map:generate src="XML/success.xml"/>
<map:transform src="XSL/success.xsl"/>
</map:act>
<map:serialize type="html"/>
</map:match>
</map:pipeline>
I have modified the pipeline in order to match my system requirements
My web page includes next form:
<form action="do-upload" method="POST" enctype="multipart/form-data">
<xsl:value-of select="CADe" />
<input type="file" name="uploadfile"/>
<input type="submit" name="action" value="UPLOAD"/>
</form>
but when I choose the file to upload, the server breaks down, and
show next error:
"The requested URL /cocoon/do-upload was not found on this server"
What am I doing wrong??? Is the action well-placed under
/WEB-INF/classes directory???
Thanks a lot ...
--> Missatge original de Steve Schwarz per a
[EMAIL PROTECTED] enviat el 27/10/2003 18:14:21
Josep,
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]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]