您可以从这个解释清楚的教程开始
http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/
我用自己的业务我可以上传大于 1gb 的文件
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import com.thatsit.App;
import com.thatsit.data.model.Message;
import com.thatsit.data.model.MessageDataModel;
import com.thatsit.data.model.RemoteOperation;
import com.thatsit.interfaces.OnRespondListener;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
/**
* Created by Marco on 29/06/2015.
*/
/**
* Uploading the file to server
* */
public class UploadFileToServer extends AsyncTask<Void, Integer, String> {
private static final String TAG = UploadFileToServer.class.getSimpleName();
public static final String DISPLAY_UPLOAD_PERCENTAGE_ACTION = "com.yourapp.app.UPLOAD_PERCENTAGE";
public static final String EXTRA_MSG_ID = "message_id";
public static final String EXTRA_PERCENTAGE = "percent";
private OnRespondListener mListener;
private long totalSize;
private Message message;
public UploadFileToServer(Message message){
this.message = message;
}
@Override
protected void onPreExecute() {
// setting progress bar to zero
//TODO implement progressbar interface
//progressBar.setProgress(0);
super.onPreExecute();
if(mListener == null){
mListener = new OnRespondListener() {
@Override
public void onSuccessResponse(String TAG, String resp) {
Log.d(TAG,String.valueOf(System.currentTimeMillis()/1000));
}
@Override
public void onErrorResponse(String TAG, String Error) {
Log.e(TAG,"Error response " + Error);
}
};
}
}
@Override
protected void onProgressUpdate(Integer... progress) {
// Making progress bar visible
// progressBar.setVisibility(View.VISIBLE);
// updating progress bar value
// progressBar.setProgress(progress[0]);
// updating percentage value
// Notify UI with broadcast message
Intent i = new Intent(DISPLAY_UPLOAD_PERCENTAGE_ACTION);
i.putExtra(EXTRA_MSG_ID, message.getId());
i.putExtra(EXTRA_PERCENTAGE, progress[0]);
App.getContext().sendBroadcast(i);
Log.d(TAG, String.valueOf(progress[0]) + "%");
}
@Override
protected String doInBackground(Void... params) {
return uploadFile();
}
private String uploadFile() {
String responseString = "";
int serverResponseCode = 0;
//String fileName = CommonServerAdd.MEDIA_UPLOAD_URL;
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
File sourceFile = new File(URI.create(message.getMediaName()));
if (!sourceFile.isFile()) {
Log.e("uploadFile", "Source File not exist :" + message.getMediaName());
} else{
try {
// open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(CommonServerAdd.MEDIA_UPLOAD_URL);
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
//conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty(RemoteOperation.KEY_MEDIA_UPLOAD, message.getMediaName());
dos = new DataOutputStream(conn.getOutputStream());
HashMap<String, String> postDataParams = new HashMap<String, String>();
// Extra parameters to pass to web server
postDataParams.put(RemoteOperation.OP_OPERATION_TAG, RemoteOperation.OP_UPLOAD_MEDIA);
postDataParams.put(MessageDataModel.KEY_SENDER_ID, App.Profile.getUid());
postDataParams.put(MessageDataModel.KEY_FROM_ME, String.valueOf(message.getFromMe()));
postDataParams.put(MessageDataModel.KEY_DATA, message.getData());
postDataParams.put(MessageDataModel.KEY_REMOTE_ID, message.getRemoteId());
postDataParams.put(MessageDataModel.KEY_TIMESTAMP, String.valueOf(message.getTimestamp()));
postDataParams.put(MessageDataModel.KEY_REMOTE_TABLE_ID, String.valueOf(message.getId()));
postDataParams.put(MessageDataModel.KEY_MEDIA_TYPE, String.valueOf(message.getMediaType()));
for(Map.Entry<String, String> entry : postDataParams.entrySet()){
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(entry.getValue());
dos.writeBytes(lineEnd);
}
//Adding Parameter media file(audio,video and image)
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"media\";filename=\""+ message.getMediaName() + "\"" + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
long fileLength = sourceFile.length();
Log.d(TAG,"totalSize= " + fileLength);
int sentBytes=0;
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
// Publish progress
sentBytes += bufferSize;
publishProgress((int)(sentBytes * 100 / bytesAvailable));
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necessary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String ServerResponseString = conn.getResponseMessage();
Log.i("uploadFile", "HTTP Response is : "
+ ServerResponseString + ": " + serverResponseCode);
if(serverResponseCode == HttpsURLConnection.HTTP_OK){
Log.d(TAG,"File Upload Completed.");
String line;
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line=br.readLine()) != null) {
responseString +=line;
}
}
//close the streams //
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
Log.d(TAG,"MalformedURLException Exception : check script url.");
ex.printStackTrace();
Log.e(TAG, "error: " + ex.getMessage(), ex);
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "Exception : " + e.getMessage(), e);
}
//return serverResponseCode;
} // End else block
return responseString;
}
private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
StringBuilder result = new StringBuilder();
boolean first = true;
for(Map.Entry<String, String> entry : params.entrySet()){
if (first)
first = false;
else
result.append("&");
result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}
return result.toString();
}
@Override
protected void onPostExecute(String result) {
Log.d(TAG, "Response from server: " + result);
super.onPostExecute(result);
try {
JSONObject response = new JSONObject(result);
String success = response.getString(RemoteOperation.RESP_SUCCESS);
if (Integer.parseInt(success) == 1) {
// return confirm
mListener.onSuccessResponse(RemoteOperation.OP_MESSAGE_DELIVERED, response.getString("serv_receipt_timestamp"));
} else {
mListener.onErrorResponse(RemoteOperation.OP_MESSAGE_DELIVERED, response.getString(RemoteOperation.RESP_ERR_MESSAGE));
}
} catch (JSONException e) {
e.printStackTrace();
mListener.onErrorResponse(RemoteOperation.OP_MESSAGE_DELIVERED, e.getMessage());
}
}
public void setResponseListener(OnRespondListener listener){
mListener = listener;
}
}
PHP:
/**
* To test this request send on payload:
* tag=302&sender_id=5588723e18dd67.58708277&key_from_me=1&data=bla+bla&key_remote_id=55886e677a97d7.22335532×tamp=12346789&key_tbl_id=20
*
* and file to upload on body with var name 'media'
*/
//Log
//Read param as get POST
$post = file_get_contents('php://input');
$path = $_SERVER['DOCUMENT_ROOT'] . '/UsersFolder/'."Log_media_upload_request.txt";
file_put_contents($path,$post);
//var_dump($_POST);
// array for final json respone
$response = array(Response::KEY_SUCCESS => 0, Response::KEY_ERROR => 1);
// getting server ip address
//$server_ip = gethostbyname(gethostname());
// final file url that is being uploaded
//$file_upload_url = 'http://' . $server_ip . '/' . 'server' . '/' . $target_path;
if (
!isset($_POST[RemoteOperation::OP_OPERATION_TAG]) ||
!isset($_POST[MessageDataModel::KEY_SENDER_ID]) ||
!isset($_POST[MessageDataModel::KEY_FROM_ME]) ||
!isset($_POST[MessageDataModel::KEY_DATA]) ||
!isset($_POST[MessageDataModel::KEY_REMOTE_ID]) ||
!isset($_POST[MessageDataModel::KEY_TIMESTAMP]) ||
!isset($_POST[MessageDataModel::KEY_DEVICE_TABLE_ID]) ||
!isset($_POST[MessageDataModel::KEY_MEDIA_TYPE]) ||
!isset($_FILES['media']['name'])
){
$response[Response::KEY_ERROR_MESSAGE] = "Param error";
echo json_encode($response);
return;
}
$operation = $_POST[RemoteOperation::OP_OPERATION_TAG];
$unique_id = $_POST[MessageDataModel::KEY_SENDER_ID];
$mediaType = $_POST[MessageDataModel::KEY_MEDIA_TYPE];
$mediaName = $_FILES['media']['name'];
//check for user exists
$user = new UserDataModel();
$myUser = new User();
if(!$myUser = $user->getUserByUid($unique_id)){
$response[Response::KEY_ERROR_MESSAGE] = "User error";
echo json_encode($response);
return;
}
$file_upload_url = $_SERVER['DOCUMENT_ROOT'] . '/UsersFolder/' . $unique_id . '/';
$media_url = 'http://www.yourserver.com/UsersFolder' ."/". $unique_id . '/';
switch($mediaType){
case MediaType::IMAGE_PROFILE_THUMB:
$target_path = $file_upload_url . 'Profile' .'/'. basename($_FILES['media']['name']);
$media_url = $media_url . 'Profile' .'/'. basename($_FILES['media']['name']);
break;
case MediaType::IMAGE:
$target_path = $file_upload_url . 'Image' .'/'. basename($_FILES['media']['name']);
$media_url = $media_url . 'Image' .'/'. basename($_FILES['media']['name']);
break;
case MediaType::VIDEO:
$target_path = $file_upload_url . 'Video' .'/'. basename($_FILES['media']['name']);
$media_url = $media_url . 'Video' .'/'. basename($_FILES['media']['name']);
break;
case MediaType::AUDIO:
$target_path = $file_upload_url . 'Audio' .'/'. basename($_FILES['media']['name']);
$media_url = $media_url . 'Audio' .'/'. basename($_FILES['media']['name']);
break;
default:
$response[Response::KEY_ERROR_MESSAGE] = "Unknown operation";
echo json_encode($response);
return;
break;
}
try {
// Throws exception in case file is not being moved
if (!move_uploaded_file($_FILES['media']['tmp_name'], $target_path)) {
// make error flag true
$response[Response::KEY_ERROR] = 1;
$response[Response::KEY_ERROR_MESSAGE] = 'Could not move the file!';
}else {
//file moved ok, carry on store message to db
$mess = new MessageDataModel();
$mediaSize = filesize($target_path);
if($mediaType == MediaType::IMAGE_PROFILE_THUMB){
//Create small thumb
//Add row to ProfileImageHistory table
include_once "DatabaseHandler/ProfileImageHistoryDataModel.php";
$profileImg = new ProfileImageHistoryDataModel();
if($result = $profileImg->uploadImageProfile($myUser->getId(),$_POST[MessageDataModel::KEY_SENDER_ID],$mediaName, $mediaType, $mediaSize, $media_url)){
// message stored successfully
$response[Response::KEY_SUCCESS] = 1;
$response[Response::KEY_ERROR] = 0;
$response[Response::RESP_SERVER_RECEIPT_TIMESTAMP] = $result;
} else {
// Exception occurred. Make error flag true
$response[Response::KEY_ERROR] = 1;
$response[Response::KEY_ERROR_MESSAGE] = "Error on store message";
}
}else{
//Store and send message as image Audio or Video
if ($result = $mess->storeMessage(
$_POST[MessageDataModel::KEY_SENDER_ID],
$_POST[MessageDataModel::KEY_FROM_ME],
$_POST[MessageDataModel::KEY_DATA],
$_POST[MessageDataModel::KEY_REMOTE_ID],
$_POST[MessageDataModel::KEY_TIMESTAMP],
$_POST[MessageDataModel::KEY_DEVICE_TABLE_ID],
$mediaName, $mediaType, $mediaSize, $media_url)
) {
// message stored successfully
$response[Response::KEY_SUCCESS] = 1;
$response[Response::KEY_ERROR] = 0;
$response[Response::RESP_SERVER_RECEIPT_TIMESTAMP] = $result;
} else {
// Exception occurred. Make error flag true
$response[Response::KEY_ERROR] = 1;
$response[Response::KEY_ERROR_MESSAGE] = "Error on store message";
}
}
}
} catch (Exception $e) {
// Exception occurred. Make error flag true
$response[Response::KEY_ERROR] = 1;
$response[Response::KEY_ERROR_MESSAGE] = "Server exception " . $e->getMessage();
}
echo json_encode($response);