【问题标题】:Uploading Multipart-form-data to php将 Multipart-form-data 上传到 php
【发布时间】:2014-11-12 09:37:22
【问题描述】:

我想将任何数据(用户名、描述、..)和照片从我的 Android 应用程序上传到我的服务器(PHP 脚本)。

通过搜索我找到了解决方案:How to take a photo and send to HTTP POST request with Android?

通过单击我的发送按钮,上传过程开始并且 php 脚本工作但 $_POST -Vars 是空的?有谁能够帮我?我的请求代码:

[...]
case R.id.btnSend:
    String strName = tName.getText().toString();
    String strEmail = tEmail.getText().toString();
    String strDatum = tDatum.getText().toString();
    String strBeschreibung = tBeschreibung.getText().toString();        

    nvPairs = new ArrayList<NameValuePair>(2);
    nvPairs.add(new BasicNameValuePair("sender", "AndoidApp"));
    nvPairs.add(new BasicNameValuePair("name", strName));
    nvPairs.add(new BasicNameValuePair("email", strEmail));
    nvPairs.add(new BasicNameValuePair("datum", strDatum));
    nvPairs.add(new BasicNameValuePair("beschreibung", strBeschreibung));
    nvPairs.add(new BasicNameValuePair("bild", bmpUrl));

    new UploadTask().execute();
}
[...]

private class UploadTask extends AsyncTask<Void, Void, List<String>> {
    @Override
    protected List<String> doInBackground(Void... params) {
        String response = "";
        try {
            response = new MultipartServer().postData(new URL(postUrl), nvPairs);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }       
}

在 MultipartServer-Code 我更改了行:

if ((avatarName = pair.getName()).equals("avatar")) {
    avatarPath = pair.getValue();
}

到这里:

if ((avatarName = pair.getName()).equals("bild")) {
    avatarPath = pair.getValue();
}

并且变量“bmpUrl”和“postUrl”在我的代码的另一行正确设置。

【问题讨论】:

  • the $_POST -Vars are empty?。那就是php。但是你没有显示你的 php 脚本。请做。如果 postData() 返回字符串是什么?
  • new UploadTask().execute(); 你没有传递数据。有关示例,请参阅 the documentation,并特别注意 execute 在调用时传递变量。
  • @Jeremy。请不要混淆OP。他将所有名称值对作为 postData() 调用的参数传递。
  • @greenapps 很抱歉您的困惑。您是否看到这些变量以线程安全方式存在于异步任务中的范围?
  • 这样想。我从未见过 AsyncTask 使用全局(活动)数据的问题。

标签: java php android forms upload


【解决方案1】:

感谢您的帮助!我找到了解决问题的方法。问题出在How to take a photo and send to HTTP POST request with Android?的脚本上

我改成这样了:

public class MultipartServer {

    private static final String TAG = "MultipartServer";
    private static final String crlf = "\r\n";
    private static final String twoHyphens = "--";
    private static final String boundary = "AaB03x"; //*****
    private String avatarName = null;
    private String avatarPath = null;

    public String postData(URL url, List<NameValuePair> nameValuePairs) throws IOException {

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setReadTimeout(10000);
        connection.setConnectTimeout(15000);
        connection.setRequestMethod("POST");
        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

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

        FileInputStream inputStream;
        OutputStream outputStream = connection.getOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);

        for (NameValuePair pair : nameValuePairs) {
            dataOutputStream.writeBytes(crlf);
            dataOutputStream.writeBytes(twoHyphens + boundary + crlf);
            dataOutputStream.writeBytes(
                    "Content-Disposition: form-data; name=\""
                    + URLEncoder.encode(pair.getName(), "UTF-8") 
                    + "\";" + crlf);
            dataOutputStream.writeBytes(crlf);
            dataOutputStream.writeBytes(URLEncoder.encode(pair.getValue(), "UTF-8"));
            if (pair.getName().equals("bild")) {
                avatarName = pair.getName();
                avatarPath = pair.getValue();
            }
        }

        // Write Avatar (if any)
        if (avatarName != null && avatarPath != null) {
            dataOutputStream.writeBytes(crlf);
            dataOutputStream.writeBytes(twoHyphens + boundary + crlf);
            dataOutputStream
                    .writeBytes("Content-Disposition: form-data; name=\""
                            + avatarName + "\";filename=\""
                            + new File(avatarPath).getName() + "\";" + crlf);
            dataOutputStream.writeBytes(crlf);

            inputStream = new FileInputStream(avatarPath);
            byte[] data = new byte[1024];
            int read;
            while ((read = inputStream.read(data)) != -1)
                dataOutputStream.write(data, 0, read);
            inputStream.close();

            dataOutputStream.writeBytes(crlf);
            dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + crlf);
        }

        dataOutputStream.flush();
        dataOutputStream.close();

        String responseMessage = connection.getResponseMessage();
        Log.d(TAG, responseMessage);

        InputStream in = connection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(in, "UTF-8"));

        StringBuilder response = new StringBuilder();
        char[] b = new char[512];
        int read;
        while ((read = bufferedReader.read(b)) != -1) {
            response.append(b, 0, read);
        }

        connection.disconnect();
        Log.d(TAG, response.toString());
        return response.toString();
    }
}

【讨论】:

    猜你喜欢
    • 2017-11-16
    • 2011-02-12
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多