httpclient post 上传文件及参数包括中文乱码问题方案
来源:互联网 发布:淘宝主页怎么上传图片 编辑:程序博客网 时间:2024/05/05 23:02
在之前一段的项目中,使用Java模仿Http Post方式发送参数以及文件,单纯的传递参数或者文件可以使用URLConnection进行相应的处理。
但是项目中涉及到既要传递普通参数,也要传递多个文件(不是单纯的传递XML文件)。在网上寻找之后,发现是使用HttClient来进行响应的操作,起初尝试多次依然不能传递参数和传递文件,后来发现时因为当使用HttpClient时,不能使用request.getParameter()对普通参数进行获取,而要在服务器端使用Upload来进行操作。
HttpClient4.2 jar下载 :http://download.csdn.net/detail/xyh94233/5349984
(本人实践可以使用,另外可能会遇到传值中文乱码问题,这是由于StringBody中格式为US-ASCII导致.解决办法重写StringBody类将格式改为UTF-8或者自己创建一个将代码复制过来即可)
import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.ParseException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.mime.MultipartEntity;import org.apache.http.entity.mime.content.FileBody;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;/** * * @author <a href="mailto:just_szl@hotmail.com"> Geray</a> * @version 1.0,2012-6-12 */public class HttpPostArgumentTest2 {//file1与file2在同一个文件夹下 filepath是该文件夹指定的路径public void SubmitPost(String url,String filename1,String filename2, String filepath){HttpClient httpclient = new DefaultHttpClient();try {HttpPost httppost = new HttpPost(url); FileBody bin = new FileBody(new File(filepath + File.separator + filename1)); FileBody bin2 = new FileBody(new File(filepath + File.separator + filename2)); StringBody comment = new StringBody(filename1); //new 一个对象 可以往对象中add值 MultipartEntity reqEntity = new MultipartEntity(); reqEntity.addPart("file1", bin);//file1为请求后台的File upload;属性 reqEntity.addPart("file2", bin2);//file2为请求后台的File upload;属性 reqEntity.addPart("filename1", comment);//filename1为请求后台的普通参数;属性 httppost.setEntity(reqEntity); //提交内容 获取返回对象 HttpResponse response = httpclient.execute(httppost); //获取返回状态 int statusCode = response.getStatusLine().getStatusCode(); if(statusCode == HttpStatus.SC_OK){ System.out.println("服务器正常响应....."); HttpEntity resEntity = response.getEntity(); System.out.println(EntityUtils.toString(resEntity));//httpclient自带的工具类读取返回数据 System.out.println(resEntity.getContent()); EntityUtils.consume(resEntity); } } catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally { try { httpclient.getConnectionManager().shutdown(); } catch (Exception ignore) { }}}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubHttpPostArgumentTest2 httpPostArgumentTest2 = new HttpPostArgumentTest2();httpPostArgumentTest2.SubmitPost("http://127.0.0.1:8080/demo/receiveData.do","test.xml","test.zip","D://test");}}
服务端代码:public void receiveData(HttpServletRequest request, HttpServletResponse response) throws AppException{ PrintWriter out = null; response.setContentType("text/html;charset=UTF-8"); Map map = new HashMap(); FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); File directory = null; List<FileItem> items = new ArrayList(); try { items = upload.parseRequest(request); // 得到所有的文件 Iterator<FileItem> it = items.iterator(); while (it.hasNext()) { FileItem fItem = (FileItem) it.next(); String fName = ""; Object fValue = null; if (fItem.isFormField()) { // 普通文本框的值 fName = fItem.getFieldName(); // fValue = fItem.getString(); fValue = fItem.getString("UTF-8"); map.put(fName, fValue); } else { // 获取上传文件的值 fName = fItem.getFieldName(); fValue = fItem.getInputStream(); map.put(fName, fValue); String name = fItem.getName(); if(name != null && !("".equals(name))) { name = name.substring(name.lastIndexOf(File.separator) + 1); // String stamp = StringUtils.getFormattedCurrDateNumberString(); String timestamp_Str = TimeUtils.getCurrYearYYYY(); directory = new File("d://test"); directory.mkdirs(); String filePath = ("d://test")+ timestamp_Str+ File.separator + name; map.put(fName + "FilePath", filePath); InputStream is = fItem.getInputStream(); FileOutputStream fos = new FileOutputStream(filePath); byte[] buffer = new byte[1024]; while (is.read(buffer) > 0) { fos.write(buffer, 0, buffer.length); } fos.flush(); fos.close(); map.put(fName + "FileName", name); } } } } catch (Exception e) { System.out.println("读取http请求属性值出错!"); // e.printStackTrace(); logger.error("读取http请求属性值出错"); } // 数据处理 try { out = response.getWriter(); out.print("{success:true, msg:'接收成功'}"); out.close(); } catch (IOException e) { e.printStackTrace(); } }
- httpclient post 上传文件及参数包括中文乱码问题方案
- httpclient上传文件,同时带字符串参数 中文乱码问题
- httpclient上传文件及文件名中文乱码问题
- HttpClient POST 中文乱码问题
- httpClient中post上传文件乱码
- httpclient post 中文问题
- HttpClient post 方式传递方式 及中文乱码解决
- ajax post传递参数中文乱码问题
- 安卓httprul post方式上传中文乱码问题解决方案
- 安卓httprul post方式上传中文乱码问题解决方案
- httpclient上传图片与参数,处理中文乱码
- httpclient 应用 文件上传 中文编码问题
- httpclient 4.3.x 版本 post 中文乱码问题
- HttpClient 4.3.* 上传带中文文件名文件文件名乱码问题的解决 - kcher
- 解决httpclient上传文件的时候中文文件名乱码的问题
- HttpClient通过post上传文件和提交参数
- HttpClient通过post上传文件和提交参数
- httpClient post提交文件上传参数的方法
- A strange lift
- MenuItem 显示中文乱码问题的解决方案
- 毕业论文备忘
- 由创建文件想起的。。。
- 面试时如何进行自我介绍
- httpclient post 上传文件及参数包括中文乱码问题方案
- 数论证明题(1)
- eclipse快捷方式
- java中MD5加密Demo
- mysql存储过程中文乱码
- 指针与数组
- Android四大组件之一Activity生命周期及解释
- 解剖Linux系统的LOG日志文件
- CentOS6安装Oracle 11g R2 手记