简体   繁体   English

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

[英]Cannot upload a file from Android to PHP server

I am making an application which uploads a file from a SD card to PHP server. 我正在制作一个文件从SD上传PHP服务器的应用程序。 Howeverm when I try to do this, I'm getting an error. 但是,当我尝试执行此操作时,出现错误。

My Android code is as below: 我的Android代码如下:

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: 和我的PHP文件如下:

upload1.php 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: 而upload.php是:

<?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 im 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. 在Android上使用POST将文件上传到HTTP服务器。

It works like a charm. 它像一种魅力。

Try to use instead move_uploaded_file() , function copy() . 尝试改用move_uploaded_file()和函数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. 成功上传后,PHP进程很可能无权将上传的文件移动到其他文件夹,因为该移动实质上包含复制和删除操作。

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, ie 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. 还有一件事-尝试不要将上传文件的权限更改为0644,因为这也可以限制为PHP进程,即,当您在Linux上处理文件系统操作时(假设服务器使用Linux机器)工作过程(在您的情况下为PHP和apache)具有特定的权限设置,也许他们没有能力删除/移动工作文件夹之外的文件。 You should also change the uploading folder permission to 755 or 777. 您还应该将上载文件夹权限更改为755或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 + "\n");
            }
            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. 这是AsyncTask“ Helpher”类,用于从Android上传图像。 To call this class use like syntax below. 要调用此类,请使用以下语法。

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

Here fileUri.getPath() local image location. 在这里,fileUri.getPath()本地映像位置。 If you want to see the server response value is avilable in " StringBuilder sb" you can print sb value 如果要在“ StringBuilder sb”中看到服务器响应值可用,则可以打印sb值

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM