您的位置:首页 > 理论基础 > 计算机网络

HttpClient通过Post上传文件

2016-08-08 16:12 387 查看
在之前一段的项目中,使用Java模仿Http Post方式发送参数以及文件,单纯的传递参数或者文件可以使用URLConnection进行相应的处理。

          但是项目中涉及到既要传递普通参数,也要传递多个文件(不是单纯的传递XML文件)。在网上寻找之后,发现是使用HttClient来进行响应的操作,起初尝试多次依然不能传递参数和传递文件,后来发现时因为当使用HttpClient时,不能使用request.getParameter()对普通参数进行获取,而要在服务器端使用Upload来进行操作。

          HttpClient4.2 jar下载 :http://download.csdn.net/detail/just_szl/4370574

         客户端代码:

[java] view
plain copy

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

  

            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 block  

                e.printStackTrace();  

            } catch (IOException e) {  

                // TODO Auto-generated catch block  

                e.printStackTrace();  

            } finally {  

                try {   

                    httpclient.getConnectionManager().shutdown();   

                } catch (Exception ignore) {  

                      

                }  

            }  

        }  

      

      

    /** 

     * @param args 

     */  

    public static void main(String[] args) {  

        // TODO Auto-generated method stub  

          

        HttpPostArgumentTest2 httpPostArgumentTest2 = new HttpPostArgumentTest2();  

          

        httpPostArgumentTest2.SubmitPost("http://127.0.0.1:8080/demo/receiveData.do",  

                "test.xml","test.zip","D://test");  

    }  

      

}  

服务端代码:

[java] view
plain copy

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

        }  

  

  

    }  

传送过程中涉及中文乱码问题暂时没有解决留到后续完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: