无法将文件从Android上传到PHP服务器

I am making an application which uploads a file from a SD card to PHP server. Howeverm when I try to do this, I'm getting an error.

My Android code is as below:

package de.fileupload;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import android.os.Bundle;

@SuppressWarnings("unused")
public class FileUpload extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final TextView tmp = (TextView) findViewById(R.id.textView1);
    tmp.setText("Hi! Click the button!");

    Button b = (Button) findViewById(R.id.button1);
    b.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    File f = new File("mnt/sdcard/SMSBackup.txt");
    try {
    f.createNewFile();
    Date d = new Date();
    PrintWriter writer = new PrintWriter(f);
    writer.println(d.toString());
    writer.close();
    HttpClient client = new DefaultHttpClient();
    httpPostFileUpload(client, "mnt/sdcard/SMSBackup.txt", "http://10.0.2.2:8080/admin/admin/upload1.php", "uploadedfile");
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    });
    }
    public void httpPostFileUpload(
    HttpClient client,
    String filePath,
    String uploadUri,
    String inputNameAttr) throws ClientProtocolException,
    IOException {
    HttpUriRequest request = new HttpPost(uploadUri);
    MultipartEntity form = new MultipartEntity();

    client.getParams().setBooleanParameter("http.protocol.expect-continue", false);
    form.addPart(inputNameAttr, new FileBody(new File(filePath)));
    ((HttpEntityEnclosingRequestBase) request).setEntity(form);
    try {
    client.execute(request);
    } catch (ClientProtocolException e) {
    throw e;
    } catch (IOException ee) {
    throw ee;
    }
    }
    }

and my PHP files are as below:

upload1.php

<meta name="generator" content="Namo WebEditor(Trial)">
<form enctype="multipart/form-data" action="upload.php" method="POST"> 
<input type="hidden" name="MAX_FILE_SIZE" value="100000" /> 
 Choose a file to upload: <input name="uploadedfile" type="file" /><br /><input 
 type="submit" value="Upload File" /> 
 </form> 
 <?php 
 $to_file = "tmp/" . basename($_FILES['uploadedfile']['name']); 
 $from_file = $_FILES['uploadedfile']['tmp_name']; 
 if (move_uploaded_file($from_file, $to_file)) { 
  echo "Successful upload"; 
 ?> 
 <a href="<?php echo $to_file;?>"><?php echo $to_file;?></a> 
 <?php 
 } else { 
 echo "Unsuccessful upload"; 
 } 
 ?> 

and upload.php is:

<?php
// Where the file is going to be placed 
$target_path = "localhost/admin/admin/uploads/";

/* Add the original filename to our target path.  
 Result is "uploads/filename.extension" */
 $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

 if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
 echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
 " has been uploaded";
 chmod ("uploads/".basename( $_FILES['uploadedfile']['name']), 0644);
 } else{
 echo "There was an error uploading the file, please try again!";
 echo "filename: " .  basename( $_FILES['uploadedfile']['name']);
 echo "target_path: " .$target_path;
 }
 ?>

Can any one please tell that where i m wrong? It always shows the unsuccessful upload for the file. While my server is running.

I am using the method described here:

Uploading files to HTTP server using POST on Android.

It works like a charm.

Try to use instead move_uploaded_file(), function copy(). They use the same input parameters, like this:

if(copy($_FILES['uploadedfile']['tmp_name'], $target_path)) { ...

Most likely the PHP process has no permissions to move the uploaded file to different folder after successful upload, because the moving contains in essence copy and delete operation.

One more thing - try not to change the permission of the uploaded file to 0644, because this also can be restricted to the PHP process, i.e. when you deal with file system operations on Linux (I assume you use Linux machine for your server) the working process (in your case PHP and apache) has particular permissions set and maybe they do not have ability to delete/move files outside their working folder. You should also change the uploading folder permission to 755 or 777.

I followed this link.. Working like a charm..

Upload File to server

Hope this help you :-)

This class allow you to upload file directly. No need to decode your file.

public class Helpher extends AsyncTask<String, Void, String> {
    Context context;
    JSONObject json;
    ProgressDialog dialog;
    int serverResponseCode = 0;
    DataOutputStream dos = null;
    FileInputStream fis = null;
    BufferedReader br = null;


    public Helpher(Context context) {
        this.context = context;
    }

    protected void onPreExecute() {

        dialog = ProgressDialog.show(Main2Activity.this, "ProgressDialog", "Wait!");
    }

    @Override
    protected String doInBackground(String... arg0) {

        try {
            File f = new File(arg0[0]);
            URL url = new URL("http://localhost:8888/imageupload.php");
            int bytesRead;
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

            String contentDisposition = "Content-Disposition: form-data; name=\"keyValueForFile\"; filename=\""
                    + f.getName() + "\"";
            String contentType = "Content-Type: application/octet-stream";


            dos = new DataOutputStream(conn.getOutputStream());
            fis = new FileInputStream(f);


            dos.writeBytes(SPACER + BOUNDARY + NEW_LINE);
            dos.writeBytes(contentDisposition + NEW_LINE);
            dos.writeBytes(contentType + NEW_LINE);
            dos.writeBytes(NEW_LINE);
            byte[] buffer = new byte[MAX_BUFFER_SIZE];
            while ((bytesRead = fis.read(buffer)) != -1) {
                dos.write(buffer, 0, bytesRead);
            }
            dos.writeBytes(NEW_LINE);
            dos.writeBytes(SPACER + BOUNDARY + SPACER);
            dos.flush();

            int responseCode = conn.getResponseCode();
            if (responseCode != 200) {
                Log.w(TAG,
                        responseCode + " Error: " + conn.getResponseMessage());
                return null;
            }

            br = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line + "
");
            }
            Log.d(TAG, "Sucessfully uploaded " + f.getName());

        } catch (MalformedURLException e) {
        } catch (IOException e) {
        } finally {
            try {
                dos.close();
                if (fis != null)
                    fis.close();
                if (br != null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return String.valueOf(serverResponseCode);
    }


    @Override
    protected void onPostExecute(String result) {
        dialog.dismiss();

    }

}

This is the AsyncTask "Helpher" class used for upload image from Android. To call this class use like syntax below.

new Main2Activity.Helpher(this).execute(fileUri.getPath());

Here fileUri.getPath() local image location. If you want to see the server response value is avilable in " StringBuilder sb" you can print sb value