Servlets.com

 

Home

What's New?

J2EE Jobs

com.oreilly.servlet

Servlet Polls

Mailing Lists

List Archives

Servlet Engines

Servlet ISPs

Servlet Tools

Documentation

Online Articles

The Soapbox

"Java Servlet
Programming,
Second Edition"

About Jason

Advertizing Info

com.oreilly.servlet FAQ
Answers to the most frequently asked questions

Below you'll find questions and answers to the most frequently asked questions about the com.oreilly.servlet library, especially the file upload components.

If you have other questions, write to cos-questions@servlets.com.

What is the com.oreilly.servlet package?

The com.oreilly.servlet package is a "must have" class library for servlet developers. There are classes to help servlets handle file uploads, generate multipart responses (server push), parse parameters, negotiate locales for internationalization, return files, manage socket connections, and act as RMI servers, as well as a class to help applets communicate with servlets. Since the first release, there are also new classes to help servlets send email messages, cache responses, and auto-detect servlet API support. The latest version is available online (with javadoc documentation) for download from http://www.servlets.com.


How do I install the com.oreilly.servlet package?

Unzip the com.oreilly.servlets distribution file using a unzip utility like WinZip or jar. Inside you'll find a file cos.jar. Place this where your server will find it, such as the WEB-INF/lib directory for your web application. For server-wide availability you can also place it into the CLASSPATH used by your server. That's it!

For more information on the WEB-INF directory see "Java Servlet Programming, 2nd Edition" and for more information on CLASSPATH entries see any introductory Java book.


What's the difference between MultipartRequest and MultipartParser?

MultipartRequest is an API for easyhandling of multipart/form-data requests (commonly known as file uploads). MultipartParser is an API for experts who want more control in handling these requests. MultipartRequest handles the entire request and then exposes the results while MultipartParser lets you walk the request piece-by-piece and deal with each piece as it comes. MultipartRequest is actually written as a thin facade on MultipartParser.


OK, so what's MultipartWrapper?

MultipartWrapper takes advantage of the filtering capability introduced in Servlet API 2.3 to make handling file uploads practically automatic. It can automatically wrap any request to invisibly handle multipart/form-data requests. For more information, see my filters article at JavaWorld.

 


Why doesn't MultipartRequest implement the HttpServletRequest interface?

It's an issue of forward compatibility. If MultipartRequest had implemented HttpServletRequest back when servlets were at API 2.0, then when API 2.1 came out and introduced new methods into the request interface, all deployments of MultipartRequest would have failed because MultipartRequest would no longer fully implement the new HttpServletRequest. The same would have happened with API 2.1 and 2.2. Now happily with API 2.3 there's an HttpServletRequestWrapper class which protects against forward compatibility concerns, and so MultipartWrapper does fully implement the HttpServletRequest interface.


Why when using com.oreilly.servlet.MultipartRequest or MultipartParser do large uploads fail?

The classes themselves were specifically designed to have no maximumupload size limit (unlike most other file upload utilities), but for your server's protection the constructor allows you to set a maximum POST size to accept. Anything upload larger than the limit is halted. The default maximum is 1 Meg. For a discussion of the difficulties a server has in notifying a client of the error, see the discussion in Java Servlet Programming, 2nd Edition, page 119.


How can I configure a maximum upload size for a single file but have no limit for the entire post?

The protocol doesn't make this easy. The only information given to the server up front is the size of the entire POST. After that, each file comes piece by piece with only a separator between them. If you want to have a maximum file size, your best bet is probably to use MultipartParser to walk the request piece by piece and when writing any file keep track of how much is written and if it exceeds your maximum you can remove the file and (if you like) halt the upload. If you want to continue the upload, you'll need to continue reading until the file it done before you can receive the next file however.


How can I select a directory for the uploaded files based on some information sent in the upload request?

Again, the protocol doesn't make this easy. In fact, there's no guarantee the browser will send the parameter information before the files. The safest approach is to create a temporary directory, upload the files into there, then after the upload move the files and/or the directory into the proper location.


Why when using com.oreilly.servlet.MultipartRequest or MultipartParser am I getting an IOException saying "Corrupt form data: premature ending" or "Separation boundary was not specified"?

This indicates there was a problem parsing the POST request submitted by the client. There can be many causes for the problem: a bug in the web form, a bug in the servlet, a bug in the web server, a bug in the browser, or a bug in your web.xml configuration. Some rare times it's a bug in the com.oreilly.servlet library itself. History has shown the web server to be the most frequent cause of problems probably because there are so many different servers and few vendors appear to test their binary upload capability. Another cause people have reported is having a web.xml with the multipart filter covered by two different filter rules mathing the same URL, and then on the second invocation the filter tries to process the request and it results in "Corrupt form data: premature ending". Example:

<filter-mapping>
    <filter-name>multipartFilter</filter-name>
    <url-pattern>/mypath</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>multipartFilter</filter-name>
    <url-pattern>/mypath/*</url-pattern>
</filter-mapping>

To investigate the issue, first, check if your problem is already posted on the "Servlet bugs you need to know about" resource on this site. If it's not well known, then you get to be among the first to learn about it! And you can share your discovery with us here!

Second, see if the upload works using the provided upload.html form and DemoRequestUploadServlet.java class. Some people have found bugs in their form that caused problems. Testing this combination will see if that's the case. It will also check if it's a web.xml filter configuration issue.

If it still fails, the best way to isolate the problem is to treat it like a hardware problem and swap out components until things work, then use that knowledge to see what product has the bug, or what interaction between products causes a bug. Try swapping browsers first. You probably have multiple browsers available to you so this should be easy. If one browser fails while others work, it's likely an issue with that browser or how that browser interacts with the server. Try uploading different files too, since some files (especially binary files or files with long lines like .doc files) could be triggering bugs. You can also test against the Servlets.com upload demo at http://www.servlets.com/jservlet2/examples/ch04/index.html#ex04_21. If your browser fails against that page, it's very likely the fault of the browser because that page has been successful for many others. If it looks like everything works on the demo site but not on your server, it's very likely a server bug. Try installing a different server to make sure, and if you isolate the problem report it to your server vendor. Also please report it to us at bug-report@servlets.com so we can track it and help others.


I want to comply with your license, but I'd like something simpler. Can I negotiate a different license?

Sure, contact cos-licensing@servlets.com. Site-wide and company-wide licensing options are available, as well as licenses for redistribution.


I want an applet client so I can upload a full directory of files (or some such thing). Where can I find that?

Yes, see http://www.infomentum.com/appletfile/. It's loaded with features like directory-at-a-time uploading. Tell them Servlets.com sent you!

 

 


Home   Jobs   com.oreilly.servlet   Polls   Lists   Archives
Engines   ISPs   Tools   Docs   Articles   Soapbox   Book


Copyright © 1999-2001 Jason Hunter
All Rights Reserved
webmaster@servlets.com
Last updated: October 27, 2001