Java – How do I read the server response (JSON) for a file upload in Android?

How do I read the server response (JSON) for a file upload in Android?… here is a solution to the problem.

How do I read the server response (JSON) for a file upload in Android?

I have this code to upload the file to our server (PHP). How do I read the output of the server, not just code 200 or “ok”, but the actual JSON response?

I’ve seen examples of using InputStreamReader and BufferedReader, but I’m not sure how to use them….

public String uploadFile(){     
    String result = "Result:";
    HttpURLConnection connection = null;
    DataOutputStream outputStream = null;
    DataInputStream inputStream = null;

String pathToOurFile = "/storage/emulated/0/My Documents/My Recordings/Voice0007.aac";
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary =  "*****";

int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1*1024*1024*1024;

try
    {
        FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) );

URL url = new URL(SERVER_URL);
        connection = (HttpURLConnection) url.openConnection();

 Allow Inputs & Outputs.
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);

 Set HTTP method to POST.
        connection.setRequestMethod("POST");

connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);

outputStream = new DataOutputStream( connection.getOutputStream() );
        outputStream.writeBytes(twoHyphens + boundary + lineEnd);
        outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + pathToOurFile +"\"" + lineEnd);
        outputStream.writeBytes(lineEnd);

bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

 Read file
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        while (bytesRead > 0){
            outputStream.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }

outputStream.writeBytes(lineEnd);
        outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
        inputStream = (DataInputStream) connection.getInputStream();

 Responses from the server (code and message)
        int serverResponseCode = connection.getResponseCode();

 doesn't show the JSON respnse :(
        String serverResponseMessage = connection.getResponseMessage(); 

String line = "";
        while ((line = bufferReader.readLine()) != null) {
            Log.d("Test", line);
        }
        bufferReader.close();                    

fileInputStream.close();
        outputStream.flush();
        outputStream.close();
        result = serverResponseCode + "-"+ serverResponseMessage;
    }
    catch (Exception ex)
    {
        result = "exception: "+(ex.getStackTrace().toString()) + "\n" + ex.toString();

}finally{
        return result;
    }
}

Solution

The JSON you are looking for has been written to the HTTP response Entity Body

To get it

, you need to get the Connections InputStream and read it like this:

InputStream in;
try {
    in = connection.getInputStream();
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) > 0) {
        System.out.println(new String(buffer, 0, read, "utf-8"));
    }
} finally {
    in.close();
}

Related Problems and Solutions