Mantis - Resin
Viewing Issue Advanced Details
4153 minor always 08-02-10 11:40 08-02-10 13:35
ferg  
alex  
normal  
closed  
fixed  
none    
none 4.0.10  
0004153: servlet 3.0 @MultipartConfig
(rep by Wesley Wu)

I found a frustrating problem when porting my framework to accommodate the Servlet 3.0 file upload spec in Resin 4.0.8/4.0.9.

There did has a (private Object _value) in com.caucho.server.http.HttpServletRequestImpl.PartImpl, however,
if it's not a file upload but a common text form field, I could nowhere to retreive the text value
of the part throught current implementation.

I don't want to write the text value to a file and read it into a string. It's just stupid.

I know it's probably a spec issue without an

Object getValue();

or

String getTextValue();

, but it does has a workaround.

I think the getInputStream() should not return null when the Part is a normal form field.
It may return a StringReader or something to let me get the string value throught the InputStream.

maybe like this (from http://balusc.blogspot.com/2009/12/uploading-files-in-servlet-30.html) [^]

/**
  * Returns the text value of the given part.
  */
private String getValue(Part part) throws IOException {
    String value = new BufferedReader(new InputStreamReader(part.getInputStream(), encoding)).readLine();
    return (value != null) ? value : ""; // Must be empty String according HTTP spec.
}

Now I have to use

request.getParameterValues(part.getName());

to retrieve the text form field value. But I know it must be wrong, because we may have multiple fields have the same name.


Notes
(0004691)
alex   
08-02-10 13:35   
server/162p

String values are now accessible with either getParameter or getInputStream. PartImpl.getValue() made public to provide an optimized access.

import com.caucho.server.http.*;

@MultipartConfig
public class MyServlet extends HttpServlet {
  public void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    try {
      PrintWriter out = resp.getWriter();
      Collection<Part> parts = req.getParts();
      for (Part part: parts) {
        HttpServletRequestImpl.PartImpl partImpl
          = (HttpServletRequestImpl.PartImpl)part;
        out.println("name: " + part.getName());
        out.println("partImpl-value: " + partImpl.getValue());
        
        InputStream in = part.getInputStream();
        byte[] buffer = new byte[64];
        int len = in.read(buffer);
        
        out.println("toString(part.getInputStream()): " + new String(buffer, 0, len));
      }
    } catch (Exception e) {
      resp.getWriter().println("exception: " + e);
    }
  }
}