com.fly1tkg.streamfileupload.FileUploadFacade.java Source code

Java tutorial

Introduction

Here is the source code for com.fly1tkg.streamfileupload.FileUploadFacade.java

Source

/*
 * Copyright (C) 2013 fly1tkg
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.fly1tkg.streamfileupload;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.os.Handler;

public class FileUploadFacade {
    private static final String DEFAULT_FILE_KEY = "file";
    private HttpClient mHttpClient;
    private Handler mHandler;

    public FileUploadFacade() {
        mHttpClient = new DefaultHttpClient();
        mHandler = new Handler();
    };

    public FileUploadFacade(HttpClient httpClient) {
        mHttpClient = httpClient;
        mHandler = new Handler();
    }

    public void post(String url, File file, FileUploadCallback callback) {
        post(url, null, file, null, null, callback);
    }

    public void post(String url, String fileKey, File file, FileUploadCallback callback) {
        post(url, fileKey, file, null, null, callback);
    }

    public void post(String url, File file, Map<String, String> params, FileUploadCallback callback) {
        post(url, null, file, null, params, callback);
    }

    public void post(String url, String fileKey, File file, Map<String, String> params,
            FileUploadCallback callback) {
        post(url, fileKey, file, null, params, callback);
    }

    public void post(final String url, final String fileKey, final File file, final String contentType,
            final Map<String, String> params, final FileUploadCallback callback) {

        if (null == callback) {
            throw new RuntimeException("FileUploadCallback should not be null.");
        }

        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(new Runnable() {
            public void run() {
                try {
                    HttpPost httpPost = new HttpPost(url);

                    FileBody fileBody;
                    if (null == contentType) {
                        fileBody = new FileBody(file);
                    } else {
                        fileBody = new FileBody(file, contentType);
                    }

                    MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
                    if (null == fileKey) {
                        entity.addPart(DEFAULT_FILE_KEY, fileBody);
                    } else {
                        entity.addPart(fileKey, fileBody);
                    }

                    if (null != params) {
                        for (Map.Entry<String, String> e : params.entrySet()) {
                            entity.addPart(e.getKey(), new StringBody(e.getValue()));
                        }
                    }

                    httpPost.setEntity(entity);

                    upload(httpPost, callback);
                } catch (UnsupportedEncodingException e) {
                    callback.onFailure(-1, null, e);
                }
            }
        });
    }

    protected void upload(HttpUriRequest request, FileUploadCallback callback) {
        int statusCode = -1;
        String responseBody = null;
        try {
            HttpResponse httpResponse = mHttpClient.execute(request);
            StatusLine status = httpResponse.getStatusLine();
            statusCode = status.getStatusCode();
            responseBody = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");

            if (statusCode >= 300) {
                throw new HttpResponseException(status.getStatusCode(), status.getReasonPhrase());
            }

            sendSuccess(callback, statusCode, responseBody);
        } catch (HttpResponseException e) {
            sendFailure(callback, statusCode, responseBody, e);
        } catch (IOException e) {
            sendFailure(callback, statusCode, responseBody, e);
        }
    }

    private void sendSuccess(final FileUploadCallback callback, final int statusCode, final String response) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                callback.onSuccess(statusCode, response);
            }
        });
    }

    private void sendFailure(final FileUploadCallback callback, final int statusCode, final String response,
            final Throwable e) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                callback.onFailure(statusCode, response, e);
            }
        });
    }
}