Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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

share|improve this question
1  
and what is the problem –  Ibu Jan 24 '13 at 23:42
 
How can I send Two or more POST values. –  Leo Jg Jan 24 '13 at 23:43
 
Check it out... stackoverflow.com/questions/2017414/… –  Mitsuaki Ishimoto Jan 25 '13 at 0:10
add comment

2 Answers

Please check this link

This example uses HttpClient and HttpPost classes to simplify sending data to server using POST method and getting response back.

share|improve this answer
add comment

Well following Class work for me :

package com.stuxbot.lib.uxcam.cameravideo;

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();
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.