HttpClient通过Post上传文件
发布日期:2021-07-19 12:29:28 浏览次数:1 分类:技术文章

本文共 4837 字,大约阅读时间需要 16 分钟。

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

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

          HttpClient4.2 jar下载 :

         客户端代码:

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  Geray * @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");	}	}
服务端代码:

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
items = new ArrayList(); try { items = upload.parseRequest(request); // 得到所有的文件 Iterator
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(); } }

转载地址:https://blog.csdn.net/jdsjlzx/article/details/8825724 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:解决httpclient传中文乱码问题
下一篇:httpclient通过POST来上传文件,而不是通过流的形式,并在服务端进行解析(通过httpmime.jar来操作)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月27日 13时04分07秒