现在的位置: 首页 > 综合 > 正文

在STRUTS中如何通过request获取从HttpURLConnection写出的流对象

2013年09月08日 ⁄ 综合 ⁄ 共 3814字 ⁄ 字号 评论关闭

最近在一个项目中,需要从HttpURLConnection中写出流,在STRUTS中通过request获取流对象,但是,不管怎么样操作,在STRUTS的request中就是不能获取对应的流,很郁闷的说,之后找到了关键点,因为流写出的时候设置了表单提交的形式,导致STRUTS中获取流时出现了问题,struts对没有指定content-type的request请求,封装时候作了一些处理,导致无法在Action中获取request.getInputStream() 和 request.getReader()。 详细可以查看代码例子。

1. sendPost方法,从本地中获取流,写入到相应的url链接中:

   (重点):            

            //需要传递流时,一定要添加的参数,而且ACTION中通过request.getInputStream获取流的情况下,也必须添加该参数
            conn.setRequestProperty("content-type", "text/html");      //直接传递流对象   

           //以下的则是通过form组件的形式来传递流对象的,具体使用上网查看。 

          conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + java.util.UUID.randomUUID().toString()); 

	public static void main(String[] args) throws UnsupportedEncodingException {
		 
//		String url = "http://61.154.14.46:8080/exter.shtml?serviceType=1011";
		String url = "http://localhost:8080/webtest/servlet/URLTest?name=linlin";
//		String url = "http://localhost:8081/exter.shtml?serviceType=1022&menuId=4481&mobile=15806092760&text_data=linlinlin&imgName=testa.jpg";
//		getReturnData1(url);
		sendPost(url,null);
	} 

	 /**
     * 通过HTTP协议以POST形式发送指定文件至指定url
     * @param url
     * @throws IOException
     */
    public static void sendPost(String url,InputStream in) {
        
    	HttpURLConnection conn = null;
    	OutputStreamWriter osw = null;
        try {
        	File file = new File("D:/test2.jpg");
			if(!file.exists()) {
				try {
					file.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
            URL url1 = new URL(url);
            conn = (HttpURLConnection)url1.openConnection();
            conn.setReadTimeout(10000); // 缓存的最长时间
            conn.setDoInput(true);// 允许输入
            conn.setDoOutput(true);// 允许输出
            conn.setUseCaches(false); // 不允许使用缓存
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Charsert", "UTF-8"); 
            //conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + java.util.UUID.randomUUID().toString());
            //需要传递流时,一定要添加的内容,而且ACTION中通过request.getInputStream获取也必须添加该选项
            conn.setRequestProperty("content-type", "text/html"); 
            OutputStream o = conn.getOutputStream();
    		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    		int BUFFER_SIZE = 1024; 
    		byte[] buf = new byte[BUFFER_SIZE];    
    		int size = 0;    
    	    try {
    			while ((size = bis.read(buf)) != -1)     
    			    o.write(buf, 0, size);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}    
    		finally {
    			try {
    				bis.close();
    				o.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} 
            
            if (conn.getResponseCode() != HttpURLConnection.HTTP_OK)
                System.out.println( "connect failed!");
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally
        {
            if (osw != null)
                try {
                    osw.close() ;
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            
            if (conn != null)
                conn.disconnect() ;
        }
    }

2.  当按照以上方法写出流时,就可以在servlet或者action中获取对应的流信息了,代码如下:

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		String s = request.getParameter("name");
		System.out.println("s22 is " + s);
		
		InputStream in = request.getInputStream();
		if(in != null) {
			System.out.println("流不是空的。");
			this.writeInputStreamToFile(in);
			 System.out.println("server time is " + new Date());
		} else {
			System.out.println("流是空的。");
		}
		
		
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the POST method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	private void writeInputStreamToFile(InputStream in) throws FileNotFoundException {
		
		File file = new File("D:/test3.jpg");
		if(!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
        FileOutputStream fos = new FileOutputStream(file);
		BufferedInputStream bis = new BufferedInputStream(in);
		int BUFFER_SIZE = 1024; 
		byte[] buf = new byte[BUFFER_SIZE];    
		int size = 0;    
	    try {
			while ((size = bis.read(buf)) != -1)     
			    fos.write(buf, 0, size);
		} catch (IOException e) {
			e.printStackTrace();
		}    
		finally {
			try {
				bis.close();
				fos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} 
		
	}

 

抱歉!评论已关闭.