Ah yes, found the answer from the FAQ:

"Why is parseRequest() returning no items?
This most commonly happens when the request has already been parsed, or processed in some other way. Since the input stream has aleady been consumed by that earlier process, it is no longer available for parsing by Commons FileUpload. "

Therefore, since JSPWiki has already parsed the request (e.g. by using request.getParameter()), FileUpload can no longer parse the request and therefore fails. There is no way around this in a Plugin, I'm afraid...

The only option is probably to create your own Servlet and send the request there. Look how AttachmentServlet handles things, that should help you to construct your own Servlet to handle your own upload. If you want to use WikiForms, you can use the "submit" - parameter of FormOpen to point at your own servlet.

/Janne

On Oct 14, 2008, at 16:41 , Benedikt Mohrmann wrote:

Hi,

I just tried another thing.
I wrote a second plugin which contains the following code:
   StringBuffer returnStringBuffer = new StringBuffer();

   @Override
public String execute(WikiContext context, Map params) throws PluginException { returnStringBuffer.append("<div class= \"wikiform\">"); returnStringBuffer.append("<form action=\"Wiki.jsp? page=MyTest\" name=\"uploadForm\" accept-charset=\"UTF-8\" method= \"post\" enctype=\"multipart/form-data\">"); returnStringBuffer.append("<input type=\"hidden\" name= \"formname\" value=\"uploadForm\"/>"); returnStringBuffer.append("<input name=\"nbf_uploadInput\" type=\"file\" value=\"\" /><input type=\"submit\" name= \"nbf_uploadFile\" id=\"upload\" value=\"Hochladen\" />"); returnStringBuffer.append("</form></div>"); return returnStringBuffer.toString();
   }

}

I integrated the plugin into a WikiPage and in addition the following:
[{FormOutput form='uploadForm' handler='MyPlugin'}]

When I hit the button there happens nothing again.

Now when I change the sourcecode an write
enctype=\"application/x-www-form-urlencoded\">" instead of enctype= \"multipart/form-data\">"

everything works fine again.

Something is definetely not able to handle the other format.

Any ideas?

Best regards
Benedikt




Benedikt Mohrmann schrieb:
Hi,

I definetely know that it is a problem with the MyFormOpenPlugin!!!

No plugin gets activated, when I use the MyFormOpenPlugin.

I just copied the FormOpen Plugin and changed the one line to get a "multipart/form-data".
In addition I deleted the following:
   private static org.apache.log4j.Logger log =
       org.apache.log4j.Logger.getLogger( MyFormOpen.class );

log.debug( "Previous FormInfo for this form was found in context." );


But I don`t think that this can be the problem.

Is there any other way to get out of this mysery?

Best regards
Benedikt


Benedikt Mohrmann schrieb:
Hi,

does anyone have a clue, how to solve this problem?

Best regards
Benedikt


Benedikt Mohrmann schrieb:
Hi,

here is the resulting HTML code:

<div class="wikiform">
<form action="Wiki.jsp?page=MyTest" name="uploadForm" accept- charset="UTF-8" method="post" enctype="multipart/form-data">
 <input type="hidden" name="formname" value="uploadForm"/>

<input name='nbf_uploadInput' type='file' value=''/>

</p>
<p />
<p><input name='nbf_uploadFile' type='submit' value='Upload'/>

</form>
</div>

Regards
Benedikt


Janne Jalkanen schrieb:
And could you also provide the HTML code resulting from this invocation?

/Janne

On 11 Oct 2008, at 20:37, Benedikt Mohrmann wrote:

Hi,

the plugin should be activated by a click on the button.

Here is the WikiPage

[{FormSet form='uploadForm'}]
[{MyFormOpen form='uploadForm'}]
[{FormInput type='file' name='uploadInput'}]


[{FormInput type='submit' name='uploadFile' value='Upload'}]
[{FormOutput form='uploadForm' handler='MyPlugin'}]
[{FormClose}]

Best regards
Benedikt


Janne Jalkanen schrieb:

And how do you use this on a page?

/Janne

On 11 Oct 2008, at 14:52, Benedikt Mohrmann wrote:

Hi,

the plugin is quite easy:
public class MyPlugin implements WikiPlugin {

   @Override
public String execute(WikiContext context, Map params) throws PluginException { HttpServletRequest request = context.getHttpRequest(); boolean isMultipart = ServletFileUpload.isMultipartContent(request);
             // Create a factory for disk-based file items
       FileItemFactory factory = new DiskFileItemFactory();

       // Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload (factory);

       // Parse the request
       List<FileItem> items = null;
       try {
           items = upload.parseRequest(request);
       } catch (Exception e) {
           // TODO Auto-generated catch block
                     return "BUG";
       }
             boolean empty = items.isEmpty();
       String valueOf = String.valueOf(empty);


       return valueOf + "Works";
   }
}

As I said, when I hit the submitButton nothing happens.

Best regards
Benedikt


[EMAIL PROTECTED] schrieb:
Hi!

I think we might need to see the code. Can you post it to the list, please?

/janne

-- alkuper. viesti --
Aihe: Re: Upload Question
Lähettäjä: Benedikt Mohrmann <[EMAIL PROTECTED]>
Päivämäärä: 11.10.2008 12:42

Hi,

I did all this.
The HTML output is how it should be, but the request is not handled when I hit the button.

The WikiSite:
[{FormSet form='uploadForm'}]
[{MyFormOpen form='uploadForm'}]
[{FormInput type='file' name='uploadInput'}]


[{FormInput type='submit' name='uploadFile' value='Upload'}]
[{FormOutput form='uploadForm' handler='MyPlugin'}]
[{FormClose}]

To test it I wrote a plugin which justs returns "Works".
Now when I switch to the normal FormOpen tag ([{FormOpen form='uploadForm'}]) the output is "Works".
When I use my own one, there is no output.

Any ideas, why this is not handled?

Best regards
Benedikt


Janne Jalkanen schrieb:

They are real plugins.

I recommend that you copy FormOpen.java to MyFormOpen.java, rename the class, change the code, and then use [{MyFormOpen}] instead of [{FormOpen}] in the plugins that you need.

You can easily write your own plugin which does what you said:

package whatever.package.you.use;

public class MyPlugin implements WikiPlugin
{
   public String execute(WikiContext ctx, Map params)
   {
returnStringBuffer.append("<div class=\"wikiform \">"); returnStringBuffer.append("<form action= \"Wiki.jsp?page=MyTest\" name=\"uploadForm\" accept- charset=\"UTF-8\" method=\"post\" enctype=\"multipart/form-data\">"); returnStringBuffer.append("<input type=\"hidden\" name=\"formname\" value=\"uploadForm\"/>"); returnStringBuffer.append("<input name=\"nbf_Datei \" type=\"file\"><input type=\"submit\" name=\"nbf_upload \" id=\"upload\" value=\"Hochladen\" />");

      return returnStringBuffer.toString();
    }
}

then use [{whatever.package.you.use.MyPlugin}] on a wikipage. I don't know what it does, but it is easy :-)

/Janne

On Oct 10, 2008, at 16:16 , Benedikt Mohrmann wrote:


Hi,

the problem is that the Forms are directly in the JSPWiki.jar file.
Thus they are no real plugins I guess.
I tried to change the FormOpen.java and inserted
tag.append( "\" method=\""+method+"\" enctype= \"multipart/form-data\">\n" ); then build the class file and just put it into the JSPWiki.jar.

As a result all the other plugins which use forms were not working correctly (that was of course clear).
But my Upload Plugin did not work, too.
When I hit the submit button nothing happened.

Is there no possibility to insert a plugin which creates HTML code the following way: returnStringBuffer.append("<div class=\"wikiform \">"); returnStringBuffer.append("<form action=\"Wiki.jsp? page=MyTest\" name=\"uploadForm\" accept-charset=\"UTF-8 \" method=\"post\" enctype=\"multipart/form-data\">"); returnStringBuffer.append("<input type=\"hidden\" name=\"formname\" value=\"uploadForm\"/>"); returnStringBuffer.append("<input name=\"nbf_Datei \" type=\"file\"><input type=\"submit\" name=\"nbf_upload \" id=\"upload\" value=\"Hochladen\" />");

Then just integrate the plugin into the WikiPage.

And then put a second plugin via [{FormOutput form='uploadForm' handler='MyPlugin'}] into the WikiPage?

At the moment this seems not to work, as nothing happens when I click on the submit button.

Best regards
Benedikt


Janne Jalkanen schrieb:

Probably the quickest way for you now is to simply make a copy of the relevant Form plugin, name it something else, and just change the
enctype.

Also please put in a JIRA request for the enctype to be changeable,
and we'll snatch it in either 2.8.1 or 3.0.

/Janne

On Fri, Oct 10, 2008 at 10:50:32AM +0200, Benedikt Mohrmann wrote:


Hi,

just checked it again.
The problem is definetely the form:
org.apache.commons.fileupload.FileUploadBase $InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form- urlencoded

Pretty bad that you can not change the enctype.
In the Wiki Src it is:
tag.append( "\" method=\""+method+"\" enctype= \"application/x-www-form-urlencoded\">\n" );

Can't I just change this?

Another way could be to write a plugin with the following code (snippet): returnStringBuffer.append("<div class=\"wikiform \">"); returnStringBuffer.append("<form action= \"Wiki.jsp?page=MyTest\" name=\"uploadForm\" accept- charset=\"UTF-8\" method=\"post\" enctype=\"multipart/ form-data\">"); returnStringBuffer.append("<input type=\"hidden \" name=\"formname\" value=\"uploadForm\"/>"); returnStringBuffer.append("<input name= \"nbz_Datei\" type=\"file\"><input type=\"submit\" name= \"nbz_upload\" id=\"upload\" value=\"Hochladen\" />");
       returnStringBuffer.append("</form></div>");

This would create a form, but how can I tell the Wiki which plugin to use, when the button is hit?

Regards
Benedikt


Janne Jalkanen schrieb:


I think it is important to look into the cause... The stack trace would be important, yes. There could be many things failing.

/Janne

On Oct 9, 2008, at 19:15 , Harry Metske wrote:



I think so too (multipart/form-data), but can you print the stacktrace just
before returning " BUG" , maybe you'll get a clue then ?

The FormOpen class currently has a hardcoded
"application/x-www-form-urlencoded", I think this should be parameterizable
with the current value as the default.


regards,
Harry


2008/10/9 Benedikt Mohrmann <[EMAIL PROTECTED]>



Hi,

I tried a few things already, but did not get it to work so far.

At first I created a new site, which contains:
[{FormSet form='searchForm'}]
[{FormOpen form='searchForm'}]
[{FormInput type='file' name='searchInput'}]

[{FormInput type='submit' name='submit' value='Submit'}]
[{FormClose}]
[{FormOutput form='searchForm' handler='MyTest2'}]

Thus there is only a form where you can upload your data.

The Plugin contains the following code (at this time really simple, just to
check if it works):
public class MyTest2 implements WikiPlugin {

 @Override
public String execute(WikiContext context, Map params) throws
PluginException {
HttpServletRequest request = context.getHttpRequest(); boolean isMultipart = ServletFileUpload.isMultipartContent(request); // Create a factory for disk-based file items FileItemFactory factory = new DiskFileItemFactory();

     // Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload (factory);

     // Parse the request
     List<FileItem> items = null;
     try {
         items = upload.parseRequest(request);
     } catch (Exception e) {
         // TODO Auto-generated catch block
         return "BUG";
     }
     return "Works";
 }
}

So far I always get the "BUG" output when I choose a file and hit the
submitbutton.
One problem could be that when I take a look at the produced HTML code, the
form is introduced with:

<form action="Wiki.jsp?page=MyTest" name="searchForm"
accept-charset="UTF-8" method="post"
enctype="application/x-www-form-urlencoded">

I think it should be the enctype: multipart/form-data
But I don't know if that is the point.

Any other ideas?


Best regards
Benedikt





Harry Metske schrieb:



my previous answer was a bit too much in a hurry....

first your compile, Eclipse tells you there is no method getHttpRequest
for
a wiki context, that is strange, looking at the source it does have it :

........
  /**
* If the request did originate from a HTTP request, * then the HTTP request can be fetched here. However, it the request * did NOT originate from a HTTP request, then this method will
   *  return null, and YOU SHOULD CHECK FOR IT!
   *
   *  @return Null, if no HTTP request was done.
   *  @since 2.0.13.
   */
  public HttpServletRequest getHttpRequest()
  {
      return m_request;
  }
.......

and if you can't compile it, I shouldn't even try to run it. Maybe you can reply the complete source of your plugin ?

regards,
Harry

2008/10/8 Benedikt Mohrmann <[EMAIL PROTECTED]>





Hi,

thanks for your answer- I already had a look at commons fileupload.
But the problem is, when I use:

HttpServletRequest request = context.getHttpRequest ();

JSPWiki tells me

HttpServletRequest cannot be resolved to a type
The type javax.servlet.http.HttpServletRequest cannot be resolved.

In addition I am implementing my plugin in Eclipse and it tells me that
there is no method getHttpRequest for a wiki context.

Best regards
Benedikt




Harry Metske schrieb:

Benedikt,




in your plugin you have access to the HttpServletRequest ( HttpServletRequest request = context.getHttpRequest(); ) . Once you have this, I think you can use many samples/tools to handle the uploaded file, but maybe the best one is commons fileupload ( http://commons.apache.org/fileupload/using.html), this binary jar is
already
in the JSPWiki distribution.

regards,
Harry

2008/10/7 Benedikt Mohrmann <[EMAIL PROTECTED]>







Hi,

my intention is to upload a file via JSPWiki, but not as an attachment.

I am trying to upload a file, thus I created a form containing a file
chooser and a submitbutton.
The goal is, that the input file is transferred to the server and then
handled by a plugin I wrote.

The plugin just puts the file as a Serializable into a database (which already works, when I read a file from my harddisk). But I am not yet not able to transfer the content of the file as a
stream
or something like that.

Any experiences how this could work?

Best regards
Benedikt





















Reply via email to