Android中發(fā)送Http請(qǐng)求(包括文件上傳、servlet接收)的實(shí)例代碼
/**
* 通過(guò)http協(xié)議提交數(shù)據(jù)到服務(wù)端,實(shí)現(xiàn)表單提交功能,包括上傳文件
* @param actionUrl 上傳路徑
* @param params 請(qǐng)求參數(shù) key為參數(shù)名,value為參數(shù)值
* @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為在服務(wù)端接收時(shí)希望保存成的文件名,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();
}
//如果出現(xiàn)亂碼可以嘗試一下方式
//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 ...
}
通過(guò)以上代碼可以成功的模擬java客戶端發(fā)送post請(qǐng)求,服務(wù)端也能接收并保存文件
java端測(cè)試的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);
}
本以為大功告成了,結(jié)果一移植到android工程中,編譯是沒(méi)有問(wèn)題的。
但是運(yùn)行時(shí)拋了異常 先是說(shuō)找不到PostMethod類,org.apache.commons.httpclient.methods.PostMethod這個(gè)類絕對(duì)是有包含的;
還有個(gè)異常就是VerifyError。 開(kāi)發(fā)中有幾次碰到這個(gè)異常都束手無(wú)策,覺(jué)得是SDK不兼容還是怎么地,哪位知道可得跟我說(shuō)說(shuō)~~
于是看網(wǎng)上有直接分析http request的內(nèi)容構(gòu)建post請(qǐng)求的,也有找到帶上傳文件的,拿下來(lái)運(yùn)行老是有些問(wèn)題,便直接通過(guò)運(yùn)行上面的java工程發(fā)送的post請(qǐng)求,在servlet中打印出請(qǐng)求內(nèi)容,然后對(duì)照著拼接字符串和流終于給實(shí)現(xiàn)了!代碼如下:
***********************************************************
/**
* 通過(guò)拼接的方式構(gòu)造請(qǐng)求內(nèi)容,實(shí)現(xiàn)參數(shù)傳輸以及文件傳輸
* @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); // 緩存的最長(zhǎng)時(shí)間
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);
// 首先組拼文本類型的參數(shù)
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());
// 發(fā)送文件數(shù)據(jù)
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());
}
//請(qǐng)求結(jié)束標(biāo)志
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
// 得到響應(yīng)碼
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響應(yīng)中的代碼:
**********************
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 ...
***************************
服務(wù)器端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");//文件保存位置
}
- android文件上傳示例分享(android圖片上傳)
- android 上傳文件到服務(wù)器代碼實(shí)例
- Android OkHttp Post上傳文件并且攜帶參數(shù)實(shí)例詳解
- Android實(shí)現(xiàn)上傳文件功能的方法
- android選擇視頻文件上傳到后臺(tái)服務(wù)器
- Android基于Http協(xié)議實(shí)現(xiàn)文件上傳功能的方法
- Android中實(shí)現(xiàn)OkHttp上傳文件到服務(wù)器并帶進(jìn)度
- Android Retrofit實(shí)現(xiàn)多圖片/文件、圖文上傳功能
- Android實(shí)現(xiàn)上傳文件到服務(wù)器實(shí)例詳解
- android通過(guò)servlet上傳文件到服務(wù)器
相關(guān)文章
Android 實(shí)現(xiàn)無(wú)網(wǎng)絡(luò)頁(yè)面切換的示例代碼
本篇文章主要介紹了Android 實(shí)現(xiàn)無(wú)網(wǎng)絡(luò)頁(yè)面切換的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Android使用原生組件WebView加載網(wǎng)頁(yè)和數(shù)據(jù)的方法
這篇文章主要介紹了Android使用原生組件WebView加載網(wǎng)頁(yè)和數(shù)據(jù)的方法的相關(guān)資料,需要的朋友可以參考下2016-09-09Android View事件分發(fā)和消費(fèi)源碼簡(jiǎn)單理解
這篇文章主要介紹了Android View事件分發(fā)和消費(fèi)源碼簡(jiǎn)單理解的相關(guān)資料,需要的朋友可以參考下2017-07-07Android之聯(lián)系人PinnedHeaderListView使用介紹
Android聯(lián)系人中的ListView是做得比較獨(dú)特的,這幾天,我把他提取出來(lái)了,寫成一個(gè)簡(jiǎn)單的例子,留著備用,感興趣的朋友可以參考下哈2013-06-06Android使用httpPost向服務(wù)器發(fā)送請(qǐng)求的方法
這篇文章主要介紹了Android使用httpPost向服務(wù)器發(fā)送請(qǐng)求的方法,實(shí)例分析了Android針對(duì)HttpPost類的操作技巧,需要的朋友可以參考下2015-12-12Java4Android開(kāi)發(fā)教程(五)java的基本數(shù)據(jù)類型特征
這篇文章主要介紹了Java4Android開(kāi)發(fā)教程的第五篇文章java的基本數(shù)據(jù)類型特征,需要的朋友可以參考下2014-10-10android異步加載圖片并緩存到本地實(shí)現(xiàn)方法
圖片過(guò)多造成內(nèi)存溢出,這個(gè)是最不容易解決的,要想一些好的緩存策略,比如大圖片使用LRU緩存策略或懶加載緩存策略。今天首先介紹一下本地緩存圖片2013-01-01Android手勢(shì)控制實(shí)現(xiàn)縮放、移動(dòng)圖片
這篇文章主要為大家詳細(xì)介紹了Android手勢(shì)控制實(shí)現(xiàn)縮放、移動(dòng)圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02Android 逆向?qū)W習(xí)詳解及實(shí)例
本文主要介紹Android 逆向?qū)W習(xí),這里整理逆向?qū)W習(xí)的思路及學(xué)習(xí)要點(diǎn),并附示例代碼,幫助大家學(xué)習(xí)理解,有需要的小伙伴可以參考下2016-09-09