Java 将多部分表单数据上载到php
我想上传任何数据(用户名,描述,…)和照片从我的Android应用到我的服务器(PHP脚本) 通过搜索,我找到了一个解决方案: 点击我的发送按钮,上传过程开始,php脚本工作,但是$u POST-Vars是空的?有人能帮我吗?我的请求代码: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();
[...]
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();
}
}