0

I have an app in Android witch takes a picture and needs to upolad it to a server with php.

At first there was no problem, I was able to upload it, but now I need to pass the path where the picture will be uploaded to the server. The problems comes when I try to send two values.

I am using the following code:

private  void httpPostFileUpload(String fpath, String uPath){
        HttpURLConnection connection = null;
        DataOutputStream outputStream = null;
        DataInputStream inputStream = null;

        //Path where to upload
        String uploadPath = uPath;

        String pathToOurFile = fpath;
        Log.v("file path",fpath.toString());
        String urlServer = "http://leojg.alwaysdata.net/tests/androidConnect/handle_upload.php";

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary =  "*****";
        String fname = "";

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

        try
        {
            File f = new File(pathToOurFile);
            fname =  f.getName();

            FileInputStream fileInputStream = new FileInputStream(f);

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

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

            // Enable POST method
            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);

            Log.d("path file", pathToOurFile);
            Log.d("path up", uploadPath);

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

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

            Log.d("amanda", "upload async finished, server response : " + serverResponseMessage);

            fileInputStream.close();
            fileInputStream = null;
            outputStream.flush();
            outputStream.close();
            outputStream = null;
            f= null;



            parent.invokeJs("pictureUploadEnded('" + fname + "')");
            this.delete(fpath);

        }
            catch (Exception ex)
        {
                Log.d("amanda", "exception uploading image : " + ex.getMessage());
        }     
}

I am pretty sure that the problem is in this line

outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile + "\"" + lineEnd);

Which is the one that makes the post body. I dont know where to attrach uploadPath

2

1 Answer 1

1

Well following Class work for me :

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import android.os.Environment;
import android.util.Log;

public class HttpPictureUpload implements Runnable {
private String TAG = "HTTPFILEUPLOAD";
private URL connectURL;
private FileInputStream fileInputStream = null;
private String pictureFileName;
private String myName;

public HttpPictureUpload(String urlString, String pictureFileNameString,
        String myNameString) {
    try {
        connectURL = new URL(urlString);

        pictureFileName = pictureFileNameString;
        myName = myNameString;

    } catch (Exception ex) {
        Log.i(TAG, "URL Malformatted");
    }
}

public void SendPictureNow() {

    Sending();
}

private void Sending() {
    int maxBufferSize = 1 * 1024*1024*1024;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";

    try {

        fileInputStream = new FileInputStream(Environment
                .getExternalStorageDirectory().toString()
                + "/Picture/"
                + pictureFileName);

        Log.e(TAG, "Starting Http File Sending to URL");

        // Open a HTTP connection to the URL
        HttpURLConnection conn = (HttpURLConnection) connectURL
                .openConnection();
        conn.setChunkedStreamingMode(maxBufferSize);
        // conn.setchu

        // Allow Inputs
        conn.setDoInput(true);

        // Allow Outputs
        conn.setDoOutput(true);

        // Don't use a cached copy.
        conn.setUseCaches(false);

        // Use a post method.
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");

        conn.setRequestProperty("Content-Type",
                "multipart/form-data;boundary=" + boundary);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

        // sending appid
        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"my_name\""
                + lineEnd);
        dos.writeBytes(lineEnd);
        dos.writeBytes(myName);
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + lineEnd);


        dos.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\""
                + System.currentTimeMillis() + "\"" + lineEnd);
        dos.writeBytes(lineEnd);

        int bytesAvailable = fileInputStream.available();

        byte[] buffer = new byte[bytesAvailable];

        int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);

        while (bytesRead > 0) {
            dos.write(buffer, 0, bytesAvailable);
            bytesAvailable = fileInputStream.available();
            bytesAvailable = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
        }
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        fileInputStream.close();

        dos.flush();

        Log.e(TAG,
                "File Sent, Response: "
                        + String.valueOf(conn.getResponseCode()));

        InputStream is = conn.getInputStream();

        // retrieve the response from server
        int ch;

        StringBuffer b = new StringBuffer();

        while ((ch = is.read()) != -1) {
            b.append((char) ch);

        }

        String s = b.toString();

        Log.i("Response", s);
        dos.close();
    } catch (MalformedURLException ex) {
        Log.e(TAG, "URL error: " + ex.getMessage(), ex);
    }

    catch (IOException ioe) {
        Log.e(TAG, "IO error: " + ioe.getMessage(), ioe);
    }
}

@Override
public void run() {
    // TODO Auto-generated method stub
}
 }

Above class can be use to send picture file or any other file and one any string.
To use above :

HttpPictureUpload uploadPicture=new HttpPictureUpload("http://serverurl.com/webservice.php", "tux.png", "my name is john");
uploadPicture.SendPictureNow();
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.