Search code examples
javaapachehttpclientprogress

How to get a progress bar for a file upload with Apache HttpClient 4?


I've got the following code for a file upload with Apache's HTTP-Client (org.apache.http.client):

  public static void main(String[] args) throws Exception
  {
    String fileName = "test.avi";
    File file = new File(fileName);

    String serverResponse = null;
    HttpParams params = new BasicHttpParams();
    params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, true);
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpClient client = new DefaultHttpClient(params);
    HttpPut put = new HttpPut("http://localhost:8080/" + fileName);

    FileEntity fileEntity = new FileEntity(file, "binary/octet-stream");
    put.setEntity(fileEntity);   

    HttpResponse response = client.execute(put);
    HttpEntity entity = response.getEntity();
    if (entity != null)
    {
      serverResponse = EntityUtils.toString(entity);
      System.out.println(serverResponse);
    }
  }

It work's quite well but now I want to have a progress bar which shows the progress of the file upload. How can this be made? I found a code snippet at File Upload with Java (with progress bar) but it is designed for Apache HTTP Client 3 (org.apache.commons.httpclient) and the RequestEntity class does not exist in Apache HTTP Client 4. ;(

Maybe someone of you has an approach?

Many greetings

Benny


Solution

  • Hello guys!

    I solved the problem myself and made ​​a simple example to it.
    If there are any questions, feel free to ask.

    Here we go!

    ApplicationView.java

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpVersion;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPut;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.HttpParams;
    import org.apache.http.params.HttpProtocolParams;
    import org.apache.http.util.EntityUtils;
    
    public class ApplicationView implements ActionListener
    {
    
      File file = new File("C:/Temp/my-upload.avi");
      JProgressBar progressBar = null;
    
      public ApplicationView()
      {
        super();
      }
    
      public void createView()
      {
        JFrame frame = new JFrame("File Upload with progress bar - Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(0, 0, 300, 200);
        frame.setVisible(true);
    
        progressBar = new JProgressBar(0, 100);
        progressBar.setBounds(20, 20, 200, 30);
        progressBar.setStringPainted(true);
        progressBar.setVisible(true);
    
        JButton button = new JButton("upload");
        button.setBounds(progressBar.getX(),
                progressBar.getY() + progressBar.getHeight() + 20,
                100,
                40);
        button.addActionListener(this);
    
        JPanel panel = (JPanel) frame.getContentPane();
        panel.setLayout(null);
        panel.add(progressBar);
        panel.add(button);
        panel.setVisible(true);
      }
    
      public void actionPerformed(ActionEvent e)
      {
        try
        {
          sendFile(this.file, this.progressBar);
        }
        catch (Exception ex)
        {
          System.out.println(ex.getLocalizedMessage());
        }
      }
    
      private void sendFile(File file, JProgressBar progressBar) throws Exception
      {
        String serverResponse = null;
        HttpParams params = new BasicHttpParams();
        params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, true);
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpClient client = new DefaultHttpClient(params);
        HttpPut put = new HttpPut("http://localhost:8080/" + file.getName());
    
        ProgressBarListener listener = new ProgressBarListener(progressBar);
        FileEntityWithProgressBar fileEntity = new FileEntityWithProgressBar(file, "binary/octet-stream", listener);
        put.setEntity(fileEntity);
    
        HttpResponse response = client.execute(put);
        HttpEntity entity = response.getEntity();
        if (entity != null)
        {
          serverResponse = EntityUtils.toString(entity);
          System.out.println(serverResponse);
        }
      }
    }
    

    FileEntityWithProgressBar.java

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import org.apache.http.entity.AbstractHttpEntity;
    
    /**
     * File entity which supports a progress bar.<br/>
     * Based on "org.apache.http.entity.FileEntity".
     * @author Benny Neugebauer (www.bennyn.de)
     */
    public class FileEntityWithProgressBar extends AbstractHttpEntity implements Cloneable
    {
    
      protected final File file;
      private final ProgressBarListener listener;
      private long transferredBytes;
    
      public FileEntityWithProgressBar(final File file, final String contentType, ProgressBarListener listener)
      {
        super();
        if (file == null)
        {
          throw new IllegalArgumentException("File may not be null");
        }
        this.file = file;
        this.listener = listener;
        this.transferredBytes = 0;
        setContentType(contentType);
      }
    
      public boolean isRepeatable()
      {
        return true;
      }
    
      public long getContentLength()
      {
        return this.file.length();
      }
    
      public InputStream getContent() throws IOException
      {
        return new FileInputStream(this.file);
      }
    
      public void writeTo(final OutputStream outstream) throws IOException
      {
        if (outstream == null)
        {
          throw new IllegalArgumentException("Output stream may not be null");
        }
        InputStream instream = new FileInputStream(this.file);
        try
        {
          byte[] tmp = new byte[4096];
          int l;
          while ((l = instream.read(tmp)) != -1)
          {
            outstream.write(tmp, 0, l);
            this.transferredBytes += l;
            this.listener.updateTransferred(this.transferredBytes);
          }
          outstream.flush();
        }
        finally
        {
          instream.close();
        }
      }
    
      public boolean isStreaming()
      {
        return false;
      }
    
      @Override
      public Object clone() throws CloneNotSupportedException
      {
        return super.clone();
      }
    }
    

    ProgressBarListener.java

    import javax.swing.JProgressBar;
    
    public class ProgressBarListener
    {
    
      private int transferedMegaBytes = 0;
      private JProgressBar progressBar = null;
    
      public ProgressBarListener()
      {
        super();
      }
    
      public ProgressBarListener(JProgressBar progressBar)
      {
        this();
        this.progressBar = progressBar;
      }
    
      public void updateTransferred(long transferedBytes)
      {
        transferedMegaBytes = (int) (transferedBytes / 1048576);
        this.progressBar.setValue(transferedMegaBytes);
        this.progressBar.paint(progressBar.getGraphics());
        System.out.println("Transferred: " + transferedMegaBytes + " Megabytes.");
      }
    }
    

    Happy Coding!