亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中發送Http請求(包括文件上傳、servlet接收)的實例代碼

2020-04-11 12:20:54
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

/**
* 通過http協議提交數據到服務端,實現表單提交功能,包括上傳文件
* @param actionUrl 上傳路徑
* @param params 請求參數 key為參數名,value為參數值
* @param file 上傳文件
*/
public static void postMultiParams(String actionUrl, Map<String, String> params, FormBean[] files) {
try {
PostMethod post = new PostMethod(actionUrl);
List<art> formParams = new ArrayList<art>();
for(Map.Entry<String, String> entry : params.entrySet()){
formParams.add(new StringPart(entry.getKey(), entry.getValue()));
}

if(files!=null)
for(FormBean file : files){
//filename為在服務端接收時希望保存成的文件名,filepath是本地文件路徑(包括了源文件名),filebean中就包含了這倆屬性
formParams.add(new FilePart("file", file.getFilename(), new File(file.getFilepath())));
}

Part[] parts = new Part[formParams.size()];
Iterator<art> pit = formParams.iterator();
int i=0;

while(pit.hasNext()){
parts[i++] = pit.next();
}
//如果出現亂碼可以嘗試一下方式
//StringPart sp = new StringPart("TEXT", "testValue", "GB2312"); 
//FilePart fp = new FilePart("file", "test.txt", new File("./temp/test.txt"), null, "GB2312"
//postMethod.getParams().setContentCharset("GB2312");

MultipartRequestEntity mrp = new MultipartRequestEntity(parts, post.getParams());
post.setRequestEntity(mrp);

//execute post method
HttpClient client = new HttpClient();
int code = client.executeMethod(post);
System.out.println(code);
} catch ...
}

通過以上代碼可以成功的模擬java客戶端發送post請求,服務端也能接收并保存文件
java端測試的main方法:

復制代碼 代碼如下:

public static void main(String[] args){
String actionUrl = "http://192.168.0.123:8080/WSserver/androidUploadServlet";
Map<String, String> strParams = new HashMap<String, String>();
strParams.put("paramOne", "valueOne");
strParams.put("paramTwo", "valueTwo");
FormBean[] files = new FormBean[]{new FormBean("dest1.xml", "F:/testpostsrc/main.xml")};
HttpTool.postMultiParams(actionUrl,strParams,files);
}


本以為大功告成了,結果一移植到android工程中,編譯是沒有問題的。
但是運行時拋了異常 先是說找不到PostMethod類,org.apache.commons.httpclient.methods.PostMethod這個類絕對是有包含的;
還有個異常就是VerifyError。 開發中有幾次碰到這個異常都束手無策,覺得是SDK不兼容還是怎么地,哪位知道可得跟我說說~~
于是看網上有直接分析http request的內容構建post請求的,也有找到帶上傳文件的,拿下來運行老是有些問題,便直接通過運行上面的java工程發送的post請求,在servlet中打印出請求內容,然后對照著拼接字符串和流終于給實現了!代碼如下:
***********************************************************

復制代碼 代碼如下:

/**
* 通過拼接的方式構造請求內容,實現參數傳輸以及文件傳輸
* @param actionUrl
* @param params
* @param files
* @return
* @throws IOException
*/
public static String post(String actionUrl, Map<String, String> params,
Map<String, File> files) throws IOException {

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");
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()) {
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=/"file/"; filename=/""+file.getKey()+"/""+LINEND);
sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());

InputStream is = new FileInputStream(file.getValue());
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();
// 得到響應碼
int res = conn.getResponseCode();
if (res == 200) {
InputStream in = conn.getInputStream();
int ch;
StringBuilder sb2 = new StringBuilder();
while ((ch = in.read()) != -1) {
sb2.append((char) ch);
}
}
outStream.close();
conn.disconnect();
return in.toString();
}

**********************
button響應中的代碼:
**********************

復制代碼 代碼如下:

public void onClick(View v){
String actionUrl = getApplicationContext().getString(R.string.wtsb_req_upload);
Map<String, String> params = new HashMap<String, String>();
params.put("strParamName", "strParamValue");
Map<String, File> files = new HashMap<String, File>();
files.put("tempAndroid.txt", new File("/sdcard/temp.txt"));
try {
HttpTool.postMultiParams(actionUrl, params, files);
} catch ...

***************************
服務器端servlet代碼:
***************************

復制代碼 代碼如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

//print request.getInputStream to check request content
//HttpTool.printStreamContent(request.getInputStream());

RequestContext req = new ServletRequestContext(request);
if(FileUpload.isMultipartContent(req)){
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setFileSizeMax(FILE_MAX_SIZE);

List items = new ArrayList();
try {
items = fileUpload.parseRequest(request);
} catch ...

Iterator it = items.iterator();
while(it.hasNext()){
FileItem fileItem = (FileItem)it.next();
if(fileItem.isFormField()){
System.out.println(fileItem.getFieldName()+" "+fileItem.getName()+" "+new String(fileItem.getString().getBytes("ISO-8859-1"),"GBK"));
} else {
System.out.println(fileItem.getFieldName()+" "+fileItem.getName()+" "+
fileItem.isInMemory()+" "+fileItem.getContentType()+" "+fileItem.getSize());
if(fileItem.getName()!=null && fileItem.getSize()!=0){
File fullFile = new File(fileItem.getName());
File newFile = new File(FILE_SAVE_PATH+fullFile.getName());
try {
fileItem.write(newFile);
} catch ...
} else {
System.out.println("no file choosen or empty file");
}
}
}
}
}

public void init() throws ServletException {
//讀取在web.xml中配置的init-param  
FILE_MAX_SIZE = Long.parseLong(this.getInitParameter("file_max_size"));//上傳文件大小限制 
FILE_SAVE_PATH = this.getInitParameter("file_save_path");//文件保存位置
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
美女扒开尿口让男人操亚洲视频网站| 欧美大片免费观看在线观看网站推荐| 日韩在线播放av| 精品毛片三在线观看| 欧美在线免费视频| 国产精品第一第二| 日韩av综合中文字幕| 亚洲欧洲在线视频| 九九热这里只有精品6| 乱亲女秽乱长久久久| 精品亚洲一区二区| 精品亚洲男同gayvideo网站| 国产精品视频午夜| 色偷偷av亚洲男人的天堂| 精品国产鲁一鲁一区二区张丽| 色妞在线综合亚洲欧美| 亚洲国产又黄又爽女人高潮的| 最新国产精品拍自在线播放| 亚洲欧洲一区二区三区久久| 欧美午夜丰满在线18影院| 欧美午夜片在线免费观看| 久久久久久久久久av| 最近的2019中文字幕免费一页| 韩国v欧美v日本v亚洲| 成人激情电影一区二区| 日韩精品在线免费| 日韩精品久久久久久福利| 国产亚洲精品久久久久动| 日韩av在线免费播放| 亚洲色图国产精品| 日韩在线观看免费网站| 久久九九精品99国产精品| 亚洲乱码国产乱码精品精天堂| 国产日韩欧美自拍| 久久久免费在线观看| 国产自产女人91一区在线观看| 国产精品国产三级国产aⅴ9色| 日日狠狠久久偷偷四色综合免费| 亚洲精品99999| 不用播放器成人网| 精品人伦一区二区三区蜜桃网站| 亚洲精品免费在线视频| 国产午夜精品全部视频播放| 国产精品日韩精品| 亚洲一区美女视频在线观看免费| 在线观看国产成人av片| 亚洲最大福利视频网| 91在线观看免费高清| 亚洲欧美在线播放| 欧美一级成年大片在线观看| 日韩av电影中文字幕| 国产一区二区丝袜高跟鞋图片| 亚洲精品一区久久久久久| 日韩日本欧美亚洲| 久久久久久久久网站| 欧美日韩中文在线| 精品爽片免费看久久| 激情懂色av一区av二区av| 久久99视频免费| 精品久久在线播放| 欧美中文字幕在线观看| 欧美大成色www永久网站婷| 日韩成人在线电影网| 久久亚洲影音av资源网| 亚洲乱码国产乱码精品精天堂| 最近中文字幕mv在线一区二区三区四区| 精品日本美女福利在线观看| 欧美一级淫片丝袜脚交| 91亚洲永久免费精品| 国产香蕉精品视频一区二区三区| 欧美成人性色生活仑片| 在线看欧美日韩| 黑人巨大精品欧美一区二区| 日韩av大片免费看| 国产日韩精品在线观看| 亚洲天堂男人天堂女人天堂| 久久久精品2019中文字幕神马| 国产综合色香蕉精品| 九九热这里只有在线精品视| 精品中文字幕在线| 在线视频欧美日韩精品| 日本伊人精品一区二区三区介绍| 亚洲精品视频免费| 一区二区三区在线播放欧美| 日韩精品中文字幕在线播放| 亚洲福利小视频| 亚洲欧美日韩综合| 亚洲人av在线影院| 日韩视频欧美视频| 97精品国产97久久久久久| 国产精品久久久久久久美男| 亚洲视频专区在线| 国产成人涩涩涩视频在线观看| 久久99热精品| 久久久久久国产三级电影| 欧美大片在线免费观看| 日韩欧美视频一区二区三区| 日韩av电影国产| 亚洲第一精品电影| 国产成人拍精品视频午夜网站| 成人精品视频99在线观看免费| 亚洲精品自拍第一页| 国产精品一区二区av影院萌芽| 精品亚洲国产视频| 亚洲天堂成人在线视频| 中文字幕亚洲国产| 欧美性资源免费| 91精品国产777在线观看| 久久国产精品网站| 国产日韩欧美视频在线| 国产精品中文久久久久久久| 亚洲女人天堂成人av在线| 中文字幕一区日韩电影| 在线看欧美日韩| 国内精品久久久久久| 在线a欧美视频| 欧美成人午夜激情视频| 亚洲精品成人网| 97碰在线观看| 日韩69视频在线观看| 欧美精品免费播放| 一区二区在线视频| 狠狠躁夜夜躁久久躁别揉| 欧美精品在线播放| 在线视频欧美日韩精品| 欧美亚洲国产视频| 精品小视频在线| 亚洲人成网7777777国产| 日韩精品电影网| 在线精品播放av| 成人福利视频在线观看| 最近2019年好看中文字幕视频| 亚洲激情 国产| 国产欧美在线视频| 欧美精品日韩三级| 国产精品久久久久av| 亚洲精品日韩av| 亚洲最大福利视频网站| 91免费在线视频| 久久久噜久噜久久综合| 亚洲精品久久久久久久久久久久| 中文字幕久久久av一区| 日韩经典第一页| 国产精品大陆在线观看| 日韩视频在线免费观看| 最新国产精品亚洲| 亚洲欧美综合精品久久成人| 亚洲国产精彩中文乱码av| 欧洲成人免费视频| 久久久成人的性感天堂| 欧美在线一级va免费观看| 97在线日本国产| 欧美日在线观看| 九九综合九九综合| 亚洲精品98久久久久久中文字幕| 欧美一级在线播放| 国产91九色视频| 色老头一区二区三区| 国产69精品久久久久99| 性欧美在线看片a免费观看| 国产99久久精品一区二区| 亚洲欧美日韩一区二区在线| 日韩免费视频在线观看| 成人免费看吃奶视频网站|