/* * 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); } }); } }