Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将多部分表单数据上载到php_Java_Php_Android_Forms_Upload - Fatal编程技术网

Java 将多部分表单数据上载到php

Java 将多部分表单数据上载到php,java,php,android,forms,upload,Java,Php,Android,Forms,Upload,我想上传任何数据(用户名,描述,…)和照片从我的Android应用到我的服务器(PHP脚本) 通过搜索,我找到了一个解决方案: 点击我的发送按钮,上传过程开始,php脚本工作,但是$u POST-Vars是空的?有人能帮我吗?我的请求代码: [...] case R.id.btnSend: String strName = tName.getText().toString(); String strEmail = tEmail.getText().toString();

我想上传任何数据(用户名,描述,…)和照片从我的Android应用到我的服务器(PHP脚本)

通过搜索,我找到了一个解决方案:

点击我的发送按钮,上传过程开始,php脚本工作,但是$u 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;
    }       
}
为此:

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

变量“bmpUrl”和“postrl”在代码的另一行正确设置。

谢谢您的帮助!我找到了解决这个问题的办法。问题出在来自的脚本上

我把它改成这样:

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();
    }
}
公共类MultipartServer{
私有静态最终字符串TAG=“MultipartServer”;
私有静态最终字符串crlf=“\r\n”;
私有静态最终字符串twoHyphens=“--”;
私有静态最终字符串边界=“AaB03x”//*****
私有字符串avatarName=null;
私有字符串avatarPath=null;
公共字符串postData(URL、列表nameValuePairs)引发IOException{
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setReadTimeout(10000);
连接。设置连接超时(15000);
connection.setRequestMethod(“POST”);
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(真);
setRequestProperty(“连接”,“保持活动”);
setRequestProperty(“缓存控制”、“无缓存”);
connection.setRequestProperty(“内容类型”、“多部分/表单数据;边界=“+boundary”);
文件输入流输入流;
OutputStream OutputStream=connection.getOutputStream();
DataOutputStream DataOutputStream=新的DataOutputStream(outputStream);
for(NameValuePair对:nameValuePairs){
dataOutputStream.writeBytes(crlf);
dataOutputStream.writeBytes(两个连字符+边界+crlf);
dataOutputStream.writeBytes(
“内容处置:表单数据;名称=\”
+URLEncoder.encode(pair.getName(),“UTF-8”)
+“\”;“+crlf);
dataOutputStream.writeBytes(crlf);
dataOutputStream.writeBytes(urlcoder.encode(pair.getValue(),“UTF-8”);
if(pair.getName().equals(“bild”)){
avatarName=pair.getName();
avatarPath=pair.getValue();
}
}
//编写化身(如果有)
if(avatarName!=null&&avatarPath!=null){
dataOutputStream.writeBytes(crlf);
dataOutputStream.writeBytes(两个连字符+边界+crlf);
数据输出流
.writeBytes(“内容处置:表单数据;名称=\”
+虚拟名称+“\”文件名=\“”
+新文件(avatarPath.getName()+“\”;“+crlf);
dataOutputStream.writeBytes(crlf);
inputStream=新文件inputStream(虚拟路径);
字节[]数据=新字节[1024];
int-read;
而((read=inputStream.read(data))!=-1)
写入(数据,0,读取);
inputStream.close();
dataOutputStream.writeBytes(crlf);
dataOutputStream.writeBytes(两个连字符+边界+两个连字符+crlf);
}
dataOutputStream.flush();
dataOutputStream.close();
字符串responseMessage=connection.getResponseMessage();
Log.d(标签、响应消息);
InputStream in=connection.getInputStream();
BufferedReader BufferedReader=新的BufferedReader(
新的InputStreamReader(在“UTF-8”中);
StringBuilder响应=新建StringBuilder();
char[]b=新字符[512];
int-read;
而((read=bufferedReader.read(b))!=-1){
追加(b,0,read);
}
连接断开();
Log.d(TAG,response.toString());
返回response.toString();
}
}

美元后变元是空的?
。这就是php。但是您没有显示php脚本。请吧。如果postData()?在
newuploadtask().execute()中,返回字符串是什么您没有传递数据。有关示例,请参阅,并特别注意,
execute
在调用时传递变量。@Jeremy。请不要混淆OP。他正在将所有名称-值对作为postData()调用的参数传递。@greenapps为您的混淆感到抱歉。您是否看到这些变量以线程安全的方式出现在异步任务中的作用域。我从未见过AsyncTask使用全局(到活动)数据时出现问题。
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();
    }
}