`
dyg001
  • 浏览: 27664 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Android中发送Http请求实例(包括文件上传、servlet接收)

阅读更多
前天开始要准备实现手机端往服务器传参数,还要能传附件,找了不少文章和资料,现在总结一下分享分享:代码中的catch什么的就省略了,尝试了图片、txt、xml是没问题的.. 各位 尽情拍砖吧。

发完发现代码部分的格式……这个编辑器不太会用,怎么感觉把换行都去掉了,处理好换行缩进也……

首先我是写了个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");//文件保存位置

}
分享到:
评论

相关推荐

    android文件上传控件

    在Android客户端发送文件后,服务器端(可能是Java实现)需要接收并处理这些文件。服务器端可以使用Spring MVC、Servlet或其他框架来接收HTTP请求,解析上传的文件并保存到服务器。例如,使用Spring MVC的...

    android客户端上传文件,struts2服务端接收

    在Android中,文件上传主要涉及`HttpURLConnection`或`OkHttp`库,通过POST请求将文件内容发送到服务器。以下是一个简单的使用`HttpURLConnection`的示例: 1. 创建一个`MultipartEntityBuilder`实例,用来构建多...

    android下载服务器(servlet)端文件

    Android客户端会发送HTTP请求到服务器,请求中可能包含文件的URL。服务器接收到请求后,会返回文件内容。为了跟踪下载进度,可以使用`Content-Length`头信息来获取文件总大小,并在每次读取数据时更新进度条。 ####...

    java web接收上传文件服务器端示例

    本示例项目主要关注如何在服务器端使用Java Servlet接收Android客户端上传的文件。在处理上传文件时,我们通常需要关注以下几个核心知识点: 1. **HTTP协议与Multipart请求**:在Android客户端上传文件时,通常会...

    android客户端与servlet服务端交互的很好的例子

    在Android开发中,客户端与服务器端的交互是应用程序的核心部分,尤其当涉及到数据交换和远程服务调用时。本示例主要关注Android客户端如何与Servlet服务端进行有效的通信,涉及了多种数据传输方式,如传递参数、...

    android网络编程之http发送/请求服务

    在Android开发中,网络编程是不可或缺的一部分,尤其是HTTP发送/请求服务。HTTP(HyperText Transfer Protocol)是一种应用层协议,广泛用于Web应用中传输数据。本篇将详细讲解如何在Android环境中实现HTTP请求,...

    okhttp多文件上传

    在IT行业中,网络通信是应用...通过理解这些步骤,你能够有效地实现在Android或Java应用中上传多个文件到服务器。在提供的压缩包文件ClassBiao.zip和PictureDemo.zip中,可能包含了示例代码,你可以进一步研究和学习。

    android通过servlet服务器保存文件到手机

    总的来说,Android应用通过Servlet服务器保存文件到手机的过程涉及到服务器端的Servlet处理文件请求,以及客户端的网络请求和文件保存操作。确保在处理过程中考虑到错误处理、安全性和性能优化。

    安卓通过json获取webservlet上的数据

    本主题主要探讨如何在Android应用中通过JSON获取WebServlet上的数据。 首先,我们需要理解JSON的基本结构。JSON是一种基于文本的格式,它允许我们表示对象、数组、字符串、数字、布尔值和null。其基本语法包括键值...

    Android客户端远程登录web服务器数据交换实例

    本文将深入探讨“Android客户端远程登录Web服务器数据交换实例”,讲解如何使用MySQL数据库、JSON数据传输以及Struts2、JavaBean和Servlet等技术。 首先,让我们了解一下MySQL数据库。MySQL是一款开源的关系型...

    Android应用源码之安卓图片上传和文件上传带jsp服务端源码.zip

    - JSP服务端代码通常包括接收文件的Servlet,它会解析`HttpServletRequest`对象,读取上传的文件流。`DiskFileItemFactory`和`ServletFileUpload`是Apache Commons FileUpload库中的关键组件,用于处理文件上传。 ...

    Servlet和Android网络交互_MVP实现

    Servlet和Android之间的网络交互是移动应用开发中的常见需求,特别是在构建服务器端逻辑和客户端数据同步的应用时。在本项目中,我们使用Model-View-Presenter(MVP)设计模式来组织代码,使得代码结构清晰,易于...

    android实现登陆(前后台代码都有)

    主要涉及的技术点包括HTTP通信、Servlet处理请求以及Android的网络请求封装。 首先,我们来看客户端——Android应用部分。在Android中,网络请求通常通过HttpURLConnection、HttpClient或者第三方库如OkHttp来实现...

    android socket、http等6种网络通信源码

    源码示例可能包含一个简单的Servlet实现,演示了请求的接收和响应的生成。 这些源码实例涵盖了Android网络通信的基础和进阶技术,对于理解网络通信机制和提升开发技能非常有帮助。通过学习和实践,开发者可以更好地...

    安卓开发后台servlet接受数据

    4. **Servlet接收请求**: 在服务端,Servlet是Java Web应用中的一个组件,负责处理HTTP请求。当接收到GET请求时,`doGet()`方法会被调用。在这里,我们可以解析请求参数,进行业务逻辑处理,然后准备返回的数据。 ...

    android上传图片至服务器转[归纳].pdf

    总的来说,这个实例涵盖了Android图片上传的基本流程,包括服务器端接收文件的Servlet编写和Android客户端发送文件请求的实现。实际应用中,还需要考虑更多细节,例如异常处理、上传状态通知、文件类型检查、安全性...

    Java Servlet实现HTTP通信的例子.rar

    在这个例子中,Servlet被用作服务器端的组件,接收来自Android客户端的HTTP请求,并返回相应的数据。 Servlet的工作原理是:当一个HTTP请求到达服务器时,服务器会创建一个Servlet实例来处理该请求。Servlet通过...

    安卓文件上传

    3. **创建文件工厂和上传处理器**:使用`DiskFileItemFactory`和`ServletFileUpload`实例来处理请求中的文件项。 4. **解析请求**:`upload.parseRequest(req)`解析请求中的所有文件项,将其放入`List&lt;FileItem&gt;`中...

Global site tag (gtag.js) - Google Analytics