android同时上传文件和键值对 android上传文件 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 文件存在的…但是服务器那边接受不到。好像这个方法服务器那边要额外用一个jar包是么?还是正常接收就行。 文件存在的…但是服务器那边接受不到。好像这个方法服务器那边要额外用一个jar包是么?还是正常接收就行。我的测试服务器程序不是用java实现的。这些数据都是通过http协议传送的,和服务端用什么语言实现没有关系。服务端只要通过流的方式读取每个part就可以,name虽然不是文件,但也是通过流的方式发送给服务端的。 建议楼主是用afinal框架,他的post可以提交文件和表单数据。这个是我改进的一个文件、表格数据提交post:package com.minephone.network;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.Map;import android.os.AsyncTask;import android.util.Log;/** * 文件上传 * * HashMap<String, String> params = new HashMap<String, String>(); params.put("page", "1"); params.put("name", "2"); HashMap<String, File> files = new HashMap<String, File>(); files.put("1.apk","/mnt/sdcard/1.apk")); files.put("name", new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"6.jpg")); new fileupload("http://192.168.191.1:8081/uploadtest/servlet/upload2",params, files,MainActivity.this).execute(""); * @author ping * */public class FileUpload extends AsyncTask { public static final String TAG = "FileUpload"; String actionUrl; Map<String, String> params; Map<String, File> files; UploadListener listener; public interface UploadListener { public void onUploadEnd(boolean success,String object); } public FileUpload(String actionUrl, Map<String, String> params,Map<String, File> files,UploadListener listener) { Log.i(TAG,"upload!"); this.actionUrl = actionUrl; this.params = params; this.files = files; this.listener = listener; } @Override protected String doInBackground(Object... arg0) { String reslut = null; try { String BOUNDARY = java.util.UUID.randomUUID().toString(); String PREFIX = "--", LINEND = "\r\n"; String MULTIPART_FROM_DATA = "multipart/form-data"; String CHARSET = "UTF-8"; URL uri = new URL(actionUrl); HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); conn.setReadTimeout(5 * 1000); conn.setDoInput(true);// 允许输入 conn.setDoOutput(true);// 允许输出 conn.setUseCaches(false); conn.setRequestMethod("POST"); // Post方式 conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); // 首先组拼文本类型的参数 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND); sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND); sb.append("Content-Transfer-Encoding: 8bit" + LINEND); sb.append(LINEND); sb.append(entry.getValue()); sb.append(LINEND); } DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); outStream.write(sb.toString().getBytes()); // 发送文件数据 if (files != null) // for (Map.Entry<String, File> file : files.entrySet()) { for (String key : files.keySet()) { StringBuilder sb1 = new StringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + key + "\"" + LINEND); sb1.append("Content-Type: multipart/form-data; charset=" + CHARSET + LINEND); sb1.append(LINEND); outStream.write(sb1.toString().getBytes()); File valuefile = files.get(key); InputStream is = new FileInputStream(valuefile); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { outStream.write(buffer, 0, len); } is.close(); outStream.write(LINEND.getBytes()); } // 请求结束标志 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(end_data); outStream.flush(); // 得到响应码 // success = conn.getResponseCode()==200; InputStream in = conn.getInputStream(); InputStreamReader isReader = new InputStreamReader(in); BufferedReader bufReader = new BufferedReader(isReader); String line = null; reslut = ""; while ((line = bufReader.readLine()) != null) reslut += line; outStream.close(); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } return reslut; } @Override protected void onPreExecute() { //onPreExecute方法用于在执行后台任务前做一些UI操作 Log.i(TAG, "onPreExecute() called"); } @Override protected void onCancelled() { //取消操作 Log.i(TAG, "onCancelled() called"); if (listener!=null) { listener.onUploadEnd(false, null); } } @Override protected void onPostExecute(Object result) { //onPostExecute方法用于在执行完后台任务后更新UI,显示结果 Log.i(TAG, "onPostExecute(Result result) called"); if (listener!=null) { if (result==null) { listener.onUploadEnd(false, null); } else { listener.onUploadEnd(true, result.toString()); } } } @Override protected void onProgressUpdate(Object... values) { //onProgressUpdate方法用于更新进度信息 Log.i(TAG, "onProgressUpdate() called"); } } 求助:google play 上传apk乱码问题 谈谈android内核问题 Jsoup解析 android上的RIA应用 Android EditText疑问 listview 请教高手前辈们一个问题 关于声音播放的 怎样在一个继承了非activity和service类中发广播 android sdk如何运行程序哈? [求助] 关于TabHost+ListView+VideoView的问题 求android播放网络gif图片的例子 一个蓝牙设备最多能搜索到多少个蓝牙设备?
我的测试服务器程序不是用java实现的。这些数据都是通过http协议传送的,和服务端用什么语言实现没有关系。
服务端只要通过流的方式读取每个part就可以,name虽然不是文件,但也是通过流的方式发送给服务端的。
这个是我改进的一个文件、表格数据提交post:package com.minephone.network;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import android.os.AsyncTask;
import android.util.Log;/**
* 文件上传
*
*
HashMap<String, String> params = new HashMap<String, String>();
params.put("page", "1");
params.put("name", "2"); HashMap<String, File> files = new HashMap<String, File>();
files.put("1.apk","/mnt/sdcard/1.apk"));
files.put("name", new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"6.jpg"));
new fileupload("http://192.168.191.1:8081/uploadtest/servlet/upload2",params, files,MainActivity.this).execute("");
* @author ping
*
*/
public class FileUpload extends AsyncTask {
public static final String TAG = "FileUpload";
String actionUrl;
Map<String, String> params;
Map<String, File> files;
UploadListener listener;
public interface UploadListener {
public void onUploadEnd(boolean success,String object);
}
public FileUpload(String actionUrl, Map<String, String> params,Map<String, File> files,UploadListener listener) {
Log.i(TAG,"upload!");
this.actionUrl = actionUrl;
this.params = params;
this.files = files;
this.listener = listener;
}
@Override
protected String doInBackground(Object... arg0) {
String reslut = null;
try {
String BOUNDARY = java.util.UUID.randomUUID().toString();
String PREFIX = "--", LINEND = "\r\n";
String MULTIPART_FROM_DATA = "multipart/form-data";
String CHARSET = "UTF-8";
URL uri = new URL(actionUrl);
HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
conn.setReadTimeout(5 * 1000);
conn.setDoInput(true);// 允许输入
conn.setDoOutput(true);// 允许输出
conn.setUseCaches(false);
conn.setRequestMethod("POST"); // Post方式
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);
// 首先组拼文本类型的参数
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);
sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(sb.toString().getBytes());
// 发送文件数据
if (files != null)
// for (Map.Entry<String, File> file : files.entrySet()) {
for (String key : files.keySet()) {
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + key + "\"" + LINEND);
sb1.append("Content-Type: multipart/form-data; charset=" + CHARSET + LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());
File valuefile = files.get(key);
InputStream is = new FileInputStream(valuefile);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
is.close();
outStream.write(LINEND.getBytes());
}
// 请求结束标志
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
// 得到响应码
// success = conn.getResponseCode()==200;
InputStream in = conn.getInputStream();
InputStreamReader isReader = new InputStreamReader(in);
BufferedReader bufReader = new BufferedReader(isReader);
String line = null;
reslut = "";
while ((line = bufReader.readLine()) != null)
reslut += line;
outStream.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return reslut;
}
@Override
protected void onPreExecute() {
//onPreExecute方法用于在执行后台任务前做一些UI操作
Log.i(TAG, "onPreExecute() called");
}
@Override
protected void onCancelled() {
//取消操作
Log.i(TAG, "onCancelled() called");
if (listener!=null) {
listener.onUploadEnd(false, null);
}
} @Override
protected void onPostExecute(Object result) {
//onPostExecute方法用于在执行完后台任务后更新UI,显示结果
Log.i(TAG, "onPostExecute(Result result) called");
if (listener!=null) {
if (result==null) {
listener.onUploadEnd(false, null);
} else {
listener.onUploadEnd(true, result.toString());
}
}
}
@Override
protected void onProgressUpdate(Object... values) {
//onProgressUpdate方法用于更新进度信息
Log.i(TAG, "onProgressUpdate() called");
}
}