title: java multipart upload uploads two times more data
body: <p>Hi I am using this to upload files to server. But there is some bug here so it uploads two times more data than the file size.</p>
  
  <pre><code>import java.io.BufferedReader;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.io.OutputStream;
  import java.io.OutputStreamWriter;
  import java.io.PrintWriter;
  import java.net.HttpCookie;
  import java.net.HttpURLConnection;
  import java.net.URL;
  import java.net.URLConnection;
  import java.util.ArrayList;
  import java.util.List;
  import java.util.Map;
  import static nookauto.CustomFunctions.COOKIES_HEADER;
  import static nookauto.CustomFunctions.NEWLINE;
  import static nookauto.CustomFunctions.USER_AGENT;
  import static nookauto.CustomFunctions.msCookieManager;
  
  /**
   * This utility class provides an abstraction layer for sending multipart HTTP
   * POST requests to a web server.
   * @author www.codejava.net
   *
   */
  public class MultipartUtility {
      private final String boundary;
      private static final String LINE_FEED = "\r\n";
      private HttpURLConnection httpConn;
      private String charset;
      private OutputStream outputStream;
      private PrintWriter writer;
      private String header;
      private int responseCode;
  
      /**
       * This constructor initializes a new HTTP POST request with content type
       * is set to multipart/form-data
       * @param requestURL
       * @param charset
       * @throws IOException
       */
      public MultipartUtility(String requestURL, String charset)
              throws IOException {
          this.charset = charset;
  
          // creates a unique boundary based on time stamp
          boundary = "===" + System.currentTimeMillis() + "===";
  
          URL url = new URL(requestURL);
          httpConn = (HttpURLConnection) url.openConnection();
          httpConn.setUseCaches(false);
          httpConn.setDoOutput(true); // indicates POST method
          httpConn.setDoInput(true);
          httpConn.setRequestProperty("Content-Type",
                  "multipart/form-data; boundary=" + boundary);
          //httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
          //httpConn.setRequestProperty("Test", "Bonjour");
          httpConn.setRequestProperty("User-Agent", USER_AGENT);
              //conn.setRequestProperty( "Cookie", cookies);
              if(msCookieManager.getCookieStore().getCookies().size() &gt; 0)
              {
                  //While joining the Cookies, use ',' or ';' as needed. Most of the server are using ';'
                  String cookiess = "";
  
                  for (HttpCookie s : msCookieManager.getCookieStore().getCookies())
                  {
                      cookiess += s + "; ";
                  }
                  //System.out.println("cookieee: " + cookiess);
                  httpConn.setRequestProperty("Cookie", cookiess);    
                  //conn.setRequestProperty("Cookie", TextUtils.join(";",  msCookieManager.getCookieStore().getCookies()));    
              }
          outputStream = httpConn.getOutputStream();
          writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                  true);
      }
  
      /**
       * Adds a form field to the request
       * @param name field name
       * @param value field value
       */
      public void addFormField(String name, String value) {
          //System.out.println(name+"="+value);
          writer.append("--" + boundary).append(LINE_FEED);
          writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
                  .append(LINE_FEED);
          writer.append("Content-Type: text/plain; charset=" + charset).append(
                  LINE_FEED);
          writer.append(LINE_FEED);
          writer.append(value).append(LINE_FEED);
          writer.flush();
      }
  
      /**
       * Adds a upload file section to the request
       * @param fieldName name attribute in &lt;input type="file" name="..." /&gt;
       * @param uploadFile a File to be uploaded
       * @throws IOException
       */
      public void addFilePart(String fieldName, File uploadFile)
              throws IOException {
          String fileName = uploadFile.getName();
          writer.append("--" + boundary).append(LINE_FEED);
          writer.append(
                  "Content-Disposition: form-data; name=\"" + fieldName
                          + "\"; filename=\"" + fileName + "\"")
                  .append(LINE_FEED);
          writer.append(
                  "Content-Type: "
                          + URLConnection.guessContentTypeFromName(fileName))
                  .append(LINE_FEED);
          writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
          writer.append(LINE_FEED);
          writer.flush();
  
          FileInputStream inputStream = new FileInputStream(uploadFile);
          byte[] buffer = new byte[4096];
          int bytesRead = -1;
          while ((bytesRead = inputStream.read(buffer)) != -1) {
              outputStream.write(buffer, 0, bytesRead);
          }
          outputStream.flush();
          inputStream.close();
  
          writer.append(LINE_FEED);
          writer.flush();    
      }
  
      /**
       * Adds a header field to the request.
       * @param name - name of the header field
       * @param value - value of the header field
       */
      public void addHeaderField(String name, String value) {
          writer.append(name + ": " + value).append(LINE_FEED);
          writer.flush();
      }
  
      /**
       * Completes the request and receives response from the server.
       * @return a list of Strings as response in case the server returned
       * status OK, otherwise an exception is thrown.
       * @throws IOException
       */
      public List&lt;String&gt; finish() throws IOException {
          List&lt;String&gt; response = new ArrayList&lt;String&gt;();
  
          writer.append(LINE_FEED).flush();
          writer.append("--" + boundary + "--").append(LINE_FEED);
          writer.close();
  
          StringBuilder header = new StringBuilder();
          int headerIdx = 0;
          String headerKey = null;
          String headerValue = null;
          while ( (headerValue = httpConn.getHeaderField(headerIdx)) != null ) {
            headerKey = httpConn.getHeaderFieldKey(headerIdx);
            if (headerKey != null &amp;&amp; headerKey.length()&gt;0) {
              header.append(headerKey);
              header.append(" : ");
            }
            header.append(headerValue);
            header.append(NEWLINE);
            headerIdx++;
          }
          setHeader(header.toString());
  
          // checks server's status code first
          Map&lt;String, List&lt;String&gt;&gt; headerFields = httpConn.getHeaderFields();
          List&lt;String&gt; cookiesHeader = headerFields.get(COOKIES_HEADER);
  
          if(cookiesHeader != null)
          {
              for (String cookie : cookiesHeader) 
              {
                msCookieManager.getCookieStore().add(null,HttpCookie.parse(cookie).get(0));
              }               
          }
          int status = httpConn.getResponseCode();
          setResponseCode(status);
          if (status == HttpURLConnection.HTTP_OK) {
              BufferedReader reader = new BufferedReader(new InputStreamReader(
                      httpConn.getInputStream()));
              String line = null;
              while ((line = reader.readLine()) != null) {
                  response.add(line);
              }
              reader.close();
              httpConn.disconnect();
          } else {
              throw new IOException("Server returned non-OK status: " + status);
          }
  
          return response;
      }
      private void setHeader(String header){
          this.header = header;
      }
      public String getHeader(){
          return this.header;
      }
  
      private void setResponseCode(int responseCode){
          this.responseCode = responseCode;
      }
      public int getResponseCode(){
          return this.responseCode;
      }
  }
  </code></pre>
  
  <p>Please help what is wrong here. I get this code from here <a href="http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request-programmatically" rel="nofollow">http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request-programmatically</a>
  and modified it. </p>
  
  <p>If anybody knows how to get it work normally please help.</p>