Elia D'Amato Elia D'Amato - 4 months ago 39
Android Question

Upload a file in a server with ANDROID

I want to upload a file in a server with Android Studio. I have the code, but not working. It's very strangeble. How can I do? This is the code:

public void uploadFile(String sourceFileUri) {

HttpURLConnection mHttpURLConnection = null;
DataOutputStream mOutputStream = null;
String strLineEnd = "\r\n";
String strTwoHyphens = "--";
String strUpLoadServerUri = upLoadServerUri;
String strBoundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
File sourceFile = new File(sourceFileUri);

if (!sourceFile.isFile()) {


Log.e("uploadFile", "Source File not exist :" + sourceFile.getAbsolutePath());

runOnUiThread(new Runnable() {
public void run() {
//messageText.setText("Source File not exist :"+uploadFilePath + "" + uploadFileName);
}
});

}
else
{

try {

// open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(strUpLoadServerUri);

// Open a HTTP connection to the URL

mHttpURLConnection = (HttpURLConnection) url
.openConnection();
mHttpURLConnection.setDoInput(true); // Allow Inputs
mHttpURLConnection.setDoOutput(true); // Allow Outputs
mHttpURLConnection.setUseCaches(false); // Don't use a Cached Copy

mHttpURLConnection.setRequestMethod("POST");
mHttpURLConnection.setRequestProperty("Connection","Keep-Alive");
mHttpURLConnection.setRequestProperty("ENCTYPE","multipart/form-data");
mHttpURLConnection.setRequestProperty("Content-Type","multipart/form-data;boundary=" + strBoundary);
mHttpURLConnection.setRequestProperty("uploaded_file",sourceFileUri);

mOutputStream = new DataOutputStream(mHttpURLConnection.getOutputStream());

mOutputStream.writeBytes(strTwoHyphens + strBoundary + strLineEnd);
mOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename="+ sourceFileUri + strLineEnd);

mOutputStream.writeBytes(strLineEnd);

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

while (bytesRead > 0) {

mOutputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);

}

// send multipart form data necesssary after file data...
mOutputStream.writeBytes(strLineEnd);
mOutputStream.writeBytes(strTwoHyphens + strBoundary + strTwoHyphens + strLineEnd);

// Responses from the server (code and message)
serverResponseCode = mHttpURLConnection.getResponseCode();

// close the streams //
fileInputStream.close();
mOutputStream.flush();
mOutputStream.close();

} catch (MalformedURLException ex) {
ex.printStackTrace();
Log.e("Upload file to server", "error: " + ex.getMessage(),ex);
} catch (Exception e) {
e.printStackTrace();
Log.e("Upload file to server Exception","Exception : " + e.getMessage(), e);
}
}

if (serverResponseCode == 200) {

Log.d("File Uploaded For ",sourceFileUri + " Successful");

runOnUiThread(new Runnable() {
public void run() {

/*
String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
+" http://www.androidexample.com/media/uploads/"
+uploadFileName;

//messageText.setText(msg);
*/

Toast.makeText(Page1.this, "File Upload Complete.",
Toast.LENGTH_SHORT).show();
}
});

}
else{
Log.d("File Uploaded For ",sourceFileUri + " Failed");

runOnUiThread(new Runnable() {
public void run() {

/*
String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
+" http://www.androidexample.com/media/uploads/"
+uploadFileName;

//messageText.setText(msg);
*/

Toast.makeText(Page1.this, "File Upload Failed.",
Toast.LENGTH_SHORT).show();
}
});
}


}


And this is the code PHP. I have a server with this file php:

<?php
if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], './'.$_FILES['uploaded_file']['name'])) {
echo "Success";

} else{
echo "fail";
?>

Answer

may be you can use Fast Android Networking library for that as it is simple and fast android networking library

in your gradle file add depedencies

compile 'com.amitshekhar.android:android-networking:0.0.1'

public void uploadFile(String sourceFileUri) {
    File sourceFile = new File(sourceFileUri);
    AndroidNetworking.upload(url)
                     .addMultipartFile("uploaded_file",sourceFile) 
                     .setTag("uploadTest")
                     .setPriority(Priority.HIGH)
                     .build()
                     .setUploadProgressListener(new UploadProgressListener() {
                        @Override
                        public void onProgress(long bytesUploaded, long totalBytes) {
                        // do anything with progress 
                        }
                     })
                     .getAsJSONObject(new JSONObjectRequestListener() {
                        @Override
                        public void onResponse(JSONObject response) {
                        // do anything with response                
                        }
                        @Override
                        public void onError(ANError error) {
                        // handle error 
                        }
                     }); 
}