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();          }          }  

	
				
		
原创粉丝点击