java - 将多部分表单数据上传到 php

标签 java php android forms upload

我想将任何数据(用户名、描述等)和照片从我的 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”在我的代码的另一行中正确设置。

最佳答案

感谢您的帮助!我找到了问题的解决方案。问题出在 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();
    }
}

关于java - 将多部分表单数据上传到 php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26883601/

相关文章:

java - ubuntu中java代码中的文件路径

java - 是否存在 Bigdecimal 与 MathContext.DECIMAL32 无法提供正确结果的情况?

java - 倒计时器在 3 秒后开始第一个滴答声

java - 如何在自定义 TextView 中连接可变文本值与固定字符串

android - 使用 Google Now 启动带参数的应用程序

java - 将 JAR 添加到 Visual Studio 2015 Android Ant Java 项目

java - 无限玩家的骰子游戏

php - 如何在 Docker 的 PHP7 Alpine 镜像上安装 php memcached 扩展?

php - 模拟数组在数据库中存储字符串

php - mysql_real_escape_string 转换为 mysqli