cn.clxy.upload.ApacheHCUploader.java Source code

Java tutorial

Introduction

Here is the source code for cn.clxy.upload.ApacheHCUploader.java

Source

/**
 * Copyright (C) 2013 CLXY Studio.
 * This content is released under the (Link Goes Here) MIT License.
 * http://en.wikipedia.org/wiki/MIT_License
 */
package cn.clxy.upload;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

/**
 * Use http client to upload.
 * @author clxy
 */
public class ApacheHCUploader implements Uploader {

    private static HttpClient client = createClient();
    private static final Log log = LogFactory.getLog(ApacheHCUploader.class);

    @Override
    public void upload(Part part) {

        String partName = part.getName();
        Map<String, ContentBody> params = new HashMap<String, ContentBody>();
        params.put(Config.keyFile, new ByteArrayBody(part.getContent(), partName));
        post(params);
        log.debug(partName + " uploaded.");
    }

    @Override
    public void done(String fileName, long partCount) {

        Map<String, ContentBody> params = new HashMap<String, ContentBody>();
        try {
            params.put(Config.keyFileName, new StringBody(fileName));
            params.put(Config.keyPartCount, new StringBody(String.valueOf(partCount)));
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }

        post(params);
        log.debug(fileName + " notification is done.");
    }

    private void post(Map<String, ContentBody> params) {

        HttpPost post = new HttpPost(Config.url);
        MultipartEntity entity = new MultipartEntity();
        for (Entry<String, ContentBody> e : params.entrySet()) {
            entity.addPart(e.getKey(), e.getValue());
        }
        post.setEntity(entity);

        try {
            HttpResponse response = client.execute(post);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK) {
                throw new RuntimeException("Upload failed.");
            }
        } catch (Exception e) {
            post.abort();
            throw new RuntimeException(e);
        } finally {
            post.releaseConnection();
        }
    }

    /**
     * The timeout should be adjusted by network condition.
     * @return
     */
    private static HttpClient createClient() {

        SchemeRegistry schReg = new SchemeRegistry();
        schReg.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
        schReg.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));

        PoolingClientConnectionManager ccm = new PoolingClientConnectionManager(schReg);
        ccm.setMaxTotal(Config.maxUpload);

        HttpParams params = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(params, 10 * 1000);
        HttpConnectionParams.setSoTimeout(params, Config.timeOut);

        return new DefaultHttpClient(ccm, params);
    }
}