一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android中發送Http請求(包括文件上傳、servlet接收)的實例代碼

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

2021-01-19 14:57Android開發網 Android

首先我是寫了個java工程測試發送post請求:可以包含文本參數和文件參數

復制代碼 代碼如下:


/**
* 通過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人无码综合在线观看蜜桃 | 国产美女屁股直流白浆视频无遮挡 | 免费高清资源黄网站在线观看 | 99热精品久久| 青青草在线观看 | 香港日本三级亚洲三级 | 国产玖玖在线观看 | 亚洲aⅴ男人的天堂在线观看 | 成人区精品一区二区毛片不卡 | 国产91 最新 在线 | 午夜久久久久久网站 | 亚洲第一男人网站 | 网站视频免费 | 波多野结衣一区免费作品 | sss在线观看免费视频 | 天天色综合三 | 窝窝色资源站 | 久久三级视频 | 99精品视频免费 | 欧美综合另类 | 韩国最新理论三级在线观看 | oneday日本在线观看完整版 | 国产乱人乱精一区二区视频密 | 亚洲精品一区制服丝袜 | 亚洲国产情侣一区二区三区 | 国产麻豆在线观看网站 | 性欧美高清理论片 | 俺来操| 91在线精品老司机免费播放 | 91麻豆国产福利精品 | 2021国产麻豆剧传媒剧情动漫 | 成人高清视频在线观看 | 亚洲国产精品久久久久久网站 | 98成人| 精品国产91高清在线观看 | 91高跟丝袜| 视频免费视频观看网站 | 成人在线一区二区三区 | 日韩欧美色|