You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Matthew Albright <ma...@yahoo.com> on 2002/01/18 22:41:35 UTC

HttpClient: Code for a multipart POST method

I coded this up to satisfy a need I had for an HttpClient that did a
form POST with Content-type: multipart/form-data .

It works on the one site I needed it to work on, and it fits in the
org.apache.commons.httpclient hierarchy, so I thought I'd donate it. 
Using it is the same as any other Method:

-----------

MultipartPostMethod postMethod = new MultipartPostMethod("/");
        
postMethod.addParameter("File", new File("/root/core"));
postMethod.addParameter("submitter", "mattalbright@yahoo.com");

postMethod.setRequestHeader(authHeader);
        
int responseCode = postMethod.execute(state, conn);

-----------

It was coded similarly to the PutMethod, in that the file IS NOT
entirely read into memory before it is sent out.

FYI, if the site you're using it with requires Basic Authentication,
doing the postMethod.setRequestHeader(authHeader) manually will avoid
the file being uploaded twice (once to get back the 401, and then
once again successfully)

Do whatever you want with the code, it's all yours...

matt


__________________________________________________
Do You Yahoo!?
Send FREE video emails in Yahoo! Mail!
http://promo.yahoo.com/videomail/

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: HttpClient: Code for a multipart POST method

Posted by Matthew Albright <ma...@yahoo.com>.
And, here is the code...  (DOH!)

matt


__________________________________________________
Do You Yahoo!?
Send FREE video emails in Yahoo! Mail!
http://promo.yahoo.com/videomail/

Re: HttpClient: Code for a multipart POST method

Posted by Matthew Albright <ma...@yahoo.com>.
Hmmm, my message with the tarball attached didn't seem to go through.  
Here's a patch instead:

diff -crN
commons-httpclient/src/java/org/apache/commons/httpclient/methods/MultipartPostMethod.java
commons-httpclient-mine/src/java/org/apache/commons/httpclient/methods/MultipartPostMethod.java
*** commons-httpclient/src/java/org/apache/commons/httpclient/methods/MultipartPostMethod.java	Wed
Dec 31 16:00:00 1969
---
commons-httpclient-mine/src/java/org/apache/commons/httpclient/methods/MultipartPostMethod.java
Fri Jan 18 13:20:19 2002
***************
*** 0 ****
--- 1,235 ----
+ /*
+  * $Header: $
+  * $Revision: $
+  * $Date: $
+  * ====================================================================
+  *
+  * The Apache Software License, Version 1.1
+  *
+  * Copyright (c) 1999 The Apache Software Foundation.  All rights
+  * reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  *
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  *
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in
+  *    the documentation and/or other materials provided with the
+  *    distribution.
+  *
+  * 3. The end-user documentation included with the redistribution, if
+  *    any, must include the following acknowlegement:
+  *       "This product includes software developed by the
+  *        Apache Software Foundation (http://www.apache.org/)."
+  *    Alternately, this acknowlegement may appear in the software itself,
+  *    if and wherever such third-party acknowlegements normally appear.
+  *
+  * 4. The names "The Jakarta Project", "HttpClient", and "Apache Software
+  *    Foundation" must not be used to endorse or promote products derived
+  *    from this software without prior written permission. For written
+  *    permission, please contact apache@apache.org.
+  *
+  * 5. Products derived from this software may not be called "Apache"
+  *    nor may "Apache" appear in their names without prior written
+  *    permission of the Apache Group.
+  *
+  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+  * SUCH DAMAGE.
+  * ====================================================================
+  *
+  * This software consists of voluntary contributions made by many
+  * individuals on behalf of the Apache Software Foundation.  For more
+  * information on the Apache Software Foundation, please see
+  * <http://www.apache.org/>.
+  *
+  * [Additional notices, if required by prior licensing conditions]
+  *
+  */
+ 
+ package org.apache.commons.httpclient.methods;
+ 
+ import java.util.List;
+ import java.util.ArrayList;
+ import java.util.Iterator;
+ import java.io.File;
+ import java.io.OutputStream;
+ import java.io.IOException;
+ import java.io.FileNotFoundException;
+ import org.apache.commons.httpclient.*;
+ import org.apache.commons.httpclient.methods.multipart.*;
+ 
+ /**
+  * POST Method for Multipart encoded forms.
+  *
+  * @author <a href="mailto:mattalbright@yahoo.com">Matthew Albright</a>
+  */
+ public class MultipartPostMethod extends GetMethod 
+ {
+     private List parameters = new ArrayList();
+ 
+     /**
+      * No-arg constructor.
+      */
+     public MultipartPostMethod() 
+     {
+         super();
+     }
+ 
+     /**
+      * Path-setting constructor.
+      * @param path the path to request
+      */
+     public MultipartPostMethod(String path) 
+     {
+         super(path);
+     }
+ 
+     /**
+      * Constructor.
+      * @param path the path to request
+      * @param tempDir directory to store temp files in
+      */
+     public MultipartPostMethod(String path, String tempDir) 
+     {
+         super(path, tempDir);
+     }
+ 
+     /**
+      * Constructor.
+      * @param path the path to request
+      * @param tempDir directory to store temp files in
+      * @param tempFile file to store temporary data in
+      */
+     public MultipartPostMethod(String path, String tempDir, String tempFile) 
+     {
+         super(path, tempDir, tempFile);
+     }
+ 
+ 
+     /**
+      * Returns <tt>"POST"</tt>.
+      * @return <tt>"POST"</tt>
+      */
+     public String getName() 
+     {
+         return "POST";
+     }
+ 
+     /**
+      * Clear my request body.
+      */
+     public void recycle() 
+     {
+         super.recycle();
+         
+         parameters.clear();
+     }
+ 
+ 
+     public void addParameter(String parameterName, String parameterValue) 
+     {
+         Part param = new StringPart(parameterName, parameterValue);
+         
+         parameters.add(param);
+     }
+ 
+ 
+     public void addParameter(String parameterName, File parameterFile) 
+          throws FileNotFoundException
+     {
+         Part param = new FilePart(parameterName, parameterFile);
+         
+         parameters.add(param);
+     }
+ 
+ 
+     protected void addRequestHeaders(HttpState state, HttpConnection conn) 
+                                     throws IOException, HttpException 
+     {
+         super.addRequestHeaders(state,conn);
+         
+         if (! parameters.isEmpty()) 
+         {
+             setRequestHeader("Content-Type", 
+                  "multipart/form-data; boundary=" + Part.getBoundary());
+         }
+     }
+ 
+     /**
+      * Override method of {@link HttpMethodBase}
+      * to write request parameters as the
+      * request body.
+      */
+     protected boolean writeRequestBody(HttpState state, HttpConnection conn) 
+                                       throws IOException, HttpException 
+     {
+         OutputStream out = conn.getRequestOutputStream();
+         
+         for (Iterator it = parameters.iterator(); it.hasNext();)
+         {
+             Part part = (Part)it.next();
+             
+             part.send(out);
+         }
+         
+         Part.sendLastBoundary(out);
+         
+         out.close();
+             
+         return(true);
+     }
+ 
+     /**
+      * Override method of {@link HttpMethodBase}
+      * to return the length of the request body.
+      *
+      * Once this method has been invoked,
+      * the request parameters cannot be altered
+      * until I am {@link #recycle recycled}.
+      */
+     protected int getRequestContentLength()
+     {
+         long length = 0;
+         
+         try
+         {
+             for (Iterator it = parameters.iterator(); it.hasNext();)
+             {
+                 Part part = (Part)it.next();
+             
+                 length += part.length();
+             }
+ 
+             length += Part.lengthOfLastBoundary();
+         }
+         catch (IOException e)
+         {
+             // Can't throw an IOException and still override
+             throw new RuntimeException(e.toString());
+         }
+         
+         // Chop the length to the max int value.
+         if (length <= Integer.MAX_VALUE)
+         {
+             return((new Long(length)).intValue());
+         }
+         else
+         {
+             return(Integer.MAX_VALUE);
+         }
+     }
+ }
diff -crN
commons-httpclient/src/java/org/apache/commons/httpclient/methods/multipart/FilePart.java
commons-httpclient-mine/src/java/org/apache/commons/httpclient/methods/multipart/FilePart.java
*** commons-httpclient/src/java/org/apache/commons/httpclient/methods/multipart/FilePart.java	Wed
Dec 31 16:00:00 1969
--- commons-httpclient-mine/src/java/org/apache/commons/httpclient/methods/multipart/FilePart.java
Fri Jan 18 13:20:51 2002
***************
*** 0 ****
--- 1,172 ----
+ /*
+  * $Header: $
+  * $Revision: $
+  * $Date: $
+  * ====================================================================
+  *
+  * The Apache Software License, Version 1.1
+  *
+  * Copyright (c) 1999 The Apache Software Foundation.  All rights
+  * reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  *
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  *
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in
+  *    the documentation and/or other materials provided with the
+  *    distribution.
+  *
+  * 3. The end-user documentation included with the redistribution, if
+  *    any, must include the following acknowlegement:
+  *       "This product includes software developed by the
+  *        Apache Software Foundation (http://www.apache.org/)."
+  *    Alternately, this acknowlegement may appear in the software itself,
+  *    if and wherever such third-party acknowlegements normally appear.
+  *
+  * 4. The names "The Jakarta Project", "HttpClient", and "Apache Software
+  *    Foundation" must not be used to endorse or promote products derived
+  *    from this software without prior written permission. For written
+  *    permission, please contact apache@apache.org.
+  *
+  * 5. Products derived from this software may not be called "Apache"
+  *    nor may "Apache" appear in their names without prior written
+  *    permission of the Apache Group.
+  *
+  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+  * SUCH DAMAGE.
+  * ====================================================================
+  *
+  * This software consists of voluntary contributions made by many
+  * individuals on behalf of the Apache Software Foundation.  For more
+  * information on the Apache Software Foundation, please see
+  * <http://www.apache.org/>.
+  *
+  * [Additional notices, if required by prior licensing conditions]
+  *
+  */
+ 
+ package org.apache.commons.httpclient.methods.multipart;
+ 
+ import java.io.File;
+ import java.io.FileInputStream;
+ import java.io.InputStream;
+ import java.io.OutputStream;
+ import java.io.FileNotFoundException;
+ import java.io.IOException;
+ 
+ 
+ /**
+  *
+  * This class implements a part of a Multipart post object that
+  * consists of a file.  It makes every effort to not parse or store
+  * any of the data in the file, in order to not munge a binary file,
+  * and to not break if the file is huge.  Hence, use a simple byte
+  * array, and just shove it down the OutputStream.
+  *
+  * @author <a href="mailto:mattalbright@yahoo.com">Matthew Albright</a>
+  *
+  */
+ public class FilePart extends Part
+ {
+     static int MAX_BUFF_SIZE = 1 * 1024 * 1024;  // 1 MiBs
+     
+     private String name;
+     private File file;
+     private int buff_size;
+     
+     
+     public FilePart(String name, File file) throws FileNotFoundException
+     {
+         if (! file.isFile())
+         {
+             throw new FileNotFoundException("File is not a normal file.");
+         }
+     
+         if (! file.canRead())
+         {
+             throw new FileNotFoundException("File is not readable.");
+         }
+     
+         this.name = name;
+         this.file = file;
+     }
+     
+     protected void sendHeader(OutputStream out) 
+          throws IOException
+     {
+         super.sendHeader(out);
+         sendFilename(out);
+         sendContentType(out);
+     }
+     
+     protected void sendFilename(OutputStream out) 
+          throws IOException
+     {
+         String filename = "; filename=\"" + file.getName() + "\"";
+     
+         out.write(filename.getBytes());
+     }
+ 
+     
+     protected void sendContentType(OutputStream out) 
+          throws IOException
+     {
+         out.write(CRLF_bytes);
+         out.write("Content-Type: application/octet-stream".getBytes());
+     }    
+ 
+     public String getName()  { return(name); }
+     
+     protected void sendData(OutputStream out) throws IOException
+     {
+         byte[] buff;
+         
+         if (lengthOfData() > MAX_BUFF_SIZE)
+         {
+             buff = new byte[MAX_BUFF_SIZE];
+         }
+         else
+         {
+             buff = new byte[(new Long(lengthOfData())).intValue()];
+         }
+         
+         InputStream in;
+         
+         try
+         {
+             in = new FileInputStream(file);
+         
+             int len;
+ 
+             while ((len = in.read(buff)) != -1)
+             {
+                 out.write(buff, 0, len);
+             }
+         }
+         catch (FileNotFoundException e)
+         {
+             throw new IOException(e.toString());
+         }
+     }
+     
+     protected long lengthOfData() throws IOException
+     {
+         return(file.length());
+     }
+ }
+ 
diff -crN commons-httpclient/src/java/org/apache/commons/httpclient/methods/multipart/Part.java
commons-httpclient-mine/src/java/org/apache/commons/httpclient/methods/multipart/Part.java
*** commons-httpclient/src/java/org/apache/commons/httpclient/methods/multipart/Part.java	Wed Dec
31 16:00:00 1969
--- commons-httpclient-mine/src/java/org/apache/commons/httpclient/methods/multipart/Part.java	Fri
Jan 18 13:20:38 2002
***************
*** 0 ****
--- 1,205 ----
+ /*
+  * $Header: $
+  * $Revision: $
+  * $Date: $
+  * ====================================================================
+  *
+  * The Apache Software License, Version 1.1
+  *
+  * Copyright (c) 1999 The Apache Software Foundation.  All rights
+  * reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  *
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  *
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in
+  *    the documentation and/or other materials provided with the
+  *    distribution.
+  *
+  * 3. The end-user documentation included with the redistribution, if
+  *    any, must include the following acknowlegement:
+  *       "This product includes software developed by the
+  *        Apache Software Foundation (http://www.apache.org/)."
+  *    Alternately, this acknowlegement may appear in the software itself,
+  *    if and wherever such third-party acknowlegements normally appear.
+  *
+  * 4. The names "The Jakarta Project", "HttpClient", and "Apache Software
+  *    Foundation" must not be used to endorse or promote products derived
+  *    from this software without prior written permission. For written
+  *    permission, please contact apache@apache.org.
+  *
+  * 5. Products derived from this software may not be called "Apache"
+  *    nor may "Apache" appear in their names without prior written
+  *    permission of the Apache Group.
+  *
+  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+  * SUCH DAMAGE.
+  * ====================================================================
+  *
+  * This software consists of voluntary contributions made by many
+  * individuals on behalf of the Apache Software Foundation.  For more
+  * information on the Apache Software Foundation, please see
+  * <http://www.apache.org/>.
+  *
+  * [Additional notices, if required by prior licensing conditions]
+  *
+  */
+ 
+ package org.apache.commons.httpclient.methods.multipart;
+ 
+ import java.io.OutputStream;
+ import java.io.ByteArrayOutputStream;
+ import java.io.IOException;
+ 
+ /**
+  *
+  * Abstract class for one Part of a multipart post object.
+  *
+  * @author <a href="mailto:mattalbright@yahoo.com">Matthew Albright</a>
+  *
+  */
+ public abstract class Part
+ {
+     static String boundary = "----------------314159265358979323846";
+     static byte[] boundary_bytes = boundary.getBytes();
+     static String CRLF = "\r\n";
+     static byte[] CRLF_bytes = CRLF.getBytes();
+     static String extra = "--";
+     static byte[] extra_bytes = extra.getBytes();
+     
+     public static String getBoundary()  { return(boundary); }
+     
+     public static void sendLastBoundary(OutputStream out)
+          throws IOException
+     {
+         out.write(extra_bytes);
+         out.write(boundary_bytes);
+         out.write(extra_bytes);
+         out.write(CRLF_bytes);
+     }
+     
+     public static int lengthOfLastBoundary()
+          throws IOException
+     {
+         ByteArrayOutputStream out = new ByteArrayOutputStream();
+         
+         sendLastBoundary(out);
+         
+         return(out.size());
+     }
+     
+     public abstract String getName();
+     
+     protected void sendStart(OutputStream out) 
+          throws IOException
+     {
+         out.write(extra_bytes);
+         out.write(boundary_bytes);
+         out.write(CRLF_bytes);
+     }
+     
+     protected int lengthOfStart()
+          throws IOException
+     {
+         ByteArrayOutputStream out = new ByteArrayOutputStream();
+         
+         sendStart(out);
+         
+         return(out.size());
+     }
+     
+     protected void sendHeader(OutputStream out) 
+          throws IOException
+     {
+         String content_dispos = 
+              "Content-Disposition: form-data; name=\"" + getName() + "\"";
+     
+         out.write(content_dispos.getBytes());
+     }
+     
+     protected int lengthOfHeader()
+          throws IOException
+     {
+         ByteArrayOutputStream out = new ByteArrayOutputStream();
+         
+         sendHeader(out);
+         
+         return(out.size());
+     }
+     
+     
+     protected void sendEndOfHeader(OutputStream out) 
+          throws IOException
+     {
+         out.write(CRLF_bytes);
+         out.write(CRLF_bytes);
+     }
+     
+     protected int lengthOfEndOfHeader()
+          throws IOException
+     {
+         ByteArrayOutputStream out = new ByteArrayOutputStream();
+         
+         sendEndOfHeader(out);
+         
+         return(out.size());
+     }
+     
+     
+     protected abstract void sendData(OutputStream out) throws IOException;
+     
+     protected abstract long lengthOfData() throws IOException;
+     
+     
+     protected void sendEnd(OutputStream out) 
+          throws IOException
+     {
+         out.write(CRLF_bytes);
+     }
+     
+     protected int lengthOfEnd()
+          throws IOException
+     {
+         ByteArrayOutputStream out = new ByteArrayOutputStream();
+         
+         sendEnd(out);
+         
+         return(out.size());
+     }
+     
+     /* The following 2 methods don't need to be final, but they DO need
+        to be overridden as a pair, and the only way to make sure of that
+        is to make sure they AREN'T overridden. */
+     final public void send(OutputStream out) throws IOException
+     {
+         sendStart(out);
+         sendHeader(out);
+         sendEndOfHeader(out);
+         sendData(out);
+         sendEnd(out);
+     }
+     
+     final public long length() throws IOException
+     {
+         return(lengthOfStart() + 
+                lengthOfHeader() + 
+                lengthOfEndOfHeader() +
+                lengthOfData() + 
+                lengthOfEnd());
+     }
+ }
diff -crN
commons-httpclient/src/java/org/apache/commons/httpclient/methods/multipart/StringPart.java
commons-httpclient-mine/src/java/org/apache/commons/httpclient/methods/multipart/StringPart.java
*** commons-httpclient/src/java/org/apache/commons/httpclient/methods/multipart/StringPart.java
Wed Dec 31 16:00:00 1969
---
commons-httpclient-mine/src/java/org/apache/commons/httpclient/methods/multipart/StringPart.java
Fri Jan 18 11:42:08 2002
***************
*** 0 ****
--- 1,95 ----
+ /*
+  * $Header: $
+  * $Revision: $
+  * $Date: $
+  * ====================================================================
+  *
+  * The Apache Software License, Version 1.1
+  *
+  * Copyright (c) 1999 The Apache Software Foundation.  All rights
+  * reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+  * are met:
+  *
+  * 1. Redistributions of source code must retain the above copyright
+  *    notice, this list of conditions and the following disclaimer.
+  *
+  * 2. Redistributions in binary form must reproduce the above copyright
+  *    notice, this list of conditions and the following disclaimer in
+  *    the documentation and/or other materials provided with the
+  *    distribution.
+  *
+  * 3. The end-user documentation included with the redistribution, if
+  *    any, must include the following acknowlegement:
+  *       "This product includes software developed by the
+  *        Apache Software Foundation (http://www.apache.org/)."
+  *    Alternately, this acknowlegement may appear in the software itself,
+  *    if and wherever such third-party acknowlegements normally appear.
+  *
+  * 4. The names "The Jakarta Project", "HttpClient", and "Apache Software
+  *    Foundation" must not be used to endorse or promote products derived
+  *    from this software without prior written permission. For written
+  *    permission, please contact apache@apache.org.
+  *
+  * 5. Products derived from this software may not be called "Apache"
+  *    nor may "Apache" appear in their names without prior written
+  *    permission of the Apache Group.
+  *
+  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+  * SUCH DAMAGE.
+  * ====================================================================
+  *
+  * This software consists of voluntary contributions made by many
+  * individuals on behalf of the Apache Software Foundation.  For more
+  * information on the Apache Software Foundation, please see
+  * <http://www.apache.org/>.
+  *
+  * [Additional notices, if required by prior licensing conditions]
+  *
+  */
+ 
+ package org.apache.commons.httpclient.methods.multipart;
+ 
+ import java.io.OutputStream;
+ import java.io.IOException;
+ 
+ /**
+  * Simple string parameter for a multipart post
+  *
+  * @author <a href="mailto:mattalbright@yahoo.com">Matthew Albright</a>
+  */
+ public class StringPart extends Part
+ {
+     private String name;
+     private String value;
+     
+     public StringPart(String name, String value)
+     {
+         this.name = name;
+         this.value = value;
+     }
+ 
+     public String getName()  { return(name); }
+     
+     protected void sendData(OutputStream out) throws IOException
+     {
+         out.write(value.getBytes());    
+     }
+     
+     protected long lengthOfData() throws IOException
+     {
+         return(value.getBytes().length);
+     }
+ }


__________________________________________________
Do You Yahoo!?
Send FREE video emails in Yahoo! Mail!
http://promo.yahoo.com/videomail/

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>