0 0

关于使用HttpURLConnection上传附件报500错误的问题15

网上介绍了很多使用HttpURLConnection调用action上传附件的问题, 但是我试了很多遍问题还是得不到解决。

1. 我在服务端使用Servlet 3内置的Part来处理附件上传, 一开始直接在html页面调用, 一些没有问题, 并保存了输入流.

2. 然后我根据之前保存的输入流在HttpURLConnection中生成一样的String并发送到服务端, 发送的代码如下:

 

package com.alex.client.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class TestAccessor {

	private static final String BOUNDARY = "-----------------------------11538186919912";

	private static final String END = "\r\n";

	public static void main(String[] args) {

		String site = "http://localhost:8080/webTest/login";
		// String param = "internatID=caowj@cn.ibm.com&password=111";

		try {
			test(site, null);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	static void test(String site, String param) throws IOException {

		URL url = new URL(site);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();

		conn.setDoInput(true);
		conn.setDoOutput(true);
		conn.setRequestMethod("POST");
		conn.setRequestProperty("connection", "Keep-Alive");
		conn.setRequestProperty("Charsert", "UTF-8");
		conn.setRequestProperty("User-Agent",
				"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
		conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="
				+ BOUNDARY);

		StringBuilder sb = new StringBuilder();

		Map<String, String> paramMap = new HashMap<String, String>();	
		paramMap.put("internatID", "caowj@cn.ibm.com");
		paramMap.put("password", "111");

		// append general parameters
		sb.append(generalParam(paramMap));

		// append file attachment
		sb.append(BOUNDARY).append(END);
		sb.append(
				"Content-Disposition: form-data; name=\"attachment\"; filename=\"focus_accounts.cmd\"")
				.append(END);
		sb.append("Content-Type: application/octet-stream").append(END);
		sb.append(END);

		BufferedReader reader = new BufferedReader(new FileReader(new File(
				"E:\\CMMouse\\focus_accounts.cmd")));

		String line = null;

		while ((line = reader.readLine()) != null) {
			sb.append(line + END);
		}

		reader.close();
		// extra file attachment, please do not remove
		sb.append(END);
		
		sb.append(BOUNDARY + "--");

		PrintWriter out = new PrintWriter(conn.getOutputStream());
		out.write(sb.toString());
		out.flush();
		out.close();

		// read return io stream
		BufferedReader rtReader = new BufferedReader(new InputStreamReader(
				conn.getInputStream()));

		
		System.out.println(conn.getResponseCode());
		String liner = null;

		while ((liner = rtReader.readLine()) != null) {
			System.out.println(liner);
		}

	}

	static StringBuilder generalParam(Map<String, String> generalParam) {

		StringBuilder sb = new StringBuilder();

		for (String key : generalParam.keySet()) {
			sb.append(BOUNDARY).append(END);
			sb.append("Content-Disposition: form-data; name=\"");
			sb.append(key);
			sb.append("\"");
			sb.append(END).append(END);
			sb.append(generalParam.get(key) + END);
		}
		return sb;
	}
}

 

 

但是调用的结果却始终是报错, 服务端的报错堆栈如下:

 

八月 12, 2013 3:18:01 下午 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [com.alex.test.LoginServlet] in context with path [/webTest] threw exception
java.lang.NullPointerException
	at com.alex.test.LoginServlet.doPost(LoginServlet.java:49)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

 

 

客户端的异常信息如下:

 

java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/webTest/login
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at com.alex.client.test.TestAccessor.test(TestAccessor.java:86)
	at com.alex.client.test.TestAccessor.main(TestAccessor.java:26)

 

我在服务端打印出的输入流都是一模一样的, 对使用浏览器生成的IO流和代码产生的IO流进行MD5校验结果也是相同的, 我实在是找不出什么办法了, 求各位大神提点.

 

2013年8月12日 15:23

5个答案 按时间排序 按投票排序

0 0

HttpClient httpclient = new DefaultHttpClient(); 
		    			HttpPost httpPost = new HttpPost("url1");
		    	        try {  
		    	        	List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>(0);  
		    	            params.add(new BasicNameValuePair("account", "xxxxx"));  
		    	            params.add(new BasicNameValuePair("password", "xxxxxx")); 
		    	            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));  
		    	            HttpResponse httpResponse = httpclient.execute(httpPost);  
		    	            if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) {  
		    	               System.out.println("ok:302");  
		    	            } else {  
		    	                System.out.println("error:" + httpResponse.getStatusLine().getStatusCode());  
		    	            }  
		    	            EntityUtils.consume(httpResponse.getEntity());
		    	            httpPost = new HttpPost("uploadUrl");
		    				FileBody file = new FileBody(new File(Constant.fpath+"/template.bwf"));  
		    				MultipartEntity reqEntity = new MultipartEntity();  
		    				reqEntity.addPart("upload", file); 
		    				httpPost.setEntity(reqEntity);  
		    				HttpResponse response = httpclient.execute(httpPost);  
		    		        if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){  
		    		        	System.out.println("ok");
		    		        }else{
		    		        	System.out.println("error");;
		    		        }
		    	        } catch (Exception e) {  
		    	            logger.error("upload",e);
		    	        }finally{
		    	        	httpPost.releaseConnection();
		    	        }

用过的上传附件的例子,可以跑得通

2013年8月15日 12:38
0 0

其它的没具体看,但是第一次看到传二进制数据是用reader或writer之类的。。。

2013年8月13日 19:05
0 0

引用
java.lang.NullPointerException  
    at com.alex.test.LoginServlet.doPost(LoginServlet.java:49)  


从服务异常来看,应该是空指针异常,你先检查这段代码

估计和文件上传逻辑还没有什么关系吧,LoginServlet是登陆时就错了?

2013年8月13日 11:12
0 0

        BufferedReader reader = new BufferedReader(new FileReader(new File(  
                "E:\\CMMouse\\focus_accounts.cmd")));  
  
        String line = null;  
  
        while ((line = reader.readLine()) != null) {  
            sb.append(line + END);  
        }  

这里可能有问题吧,文件应该按照二进制读,直接写进去吧。只是猜测,另外报null的哪行代码是什么?

2013年8月12日 16:55
0 0

        URL url = new URL(site); 
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();   这里 应该是没有连接上。

写成IP形式试试

2013年8月12日 15:32

相关推荐

Global site tag (gtag.js) - Google Analytics