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

相关推荐

    Java自带的HttpURLConnection访问接口实现文件上传

    在本文中,我们将深入探讨如何使用HttpURLConnection实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...

    android 上传附件 http

    在Android应用开发中,将附件(如图片文件)上传到服务器是常见的功能需求。这个场景通常涉及到网络通信,特别是HTTP协议的使用。本篇将详细讲解如何在Android中实现图片文件的HTTP上传。 首先,我们需要了解HTTP...

    java QQ附件java QQ附件

    6. **HTTP请求**:Java可以使用HttpURLConnection或者第三方库如Apache HttpClient或OkHttp来发起HTTP请求,实现文件的POST(上传)和GET(下载)操作。 7. **JSON序列化与反序列化**:与QQ服务器交互时,通常需要...

    android文件上传控件

    文件上传通常涉及到网络请求,Android提供了多种方式来实现,如使用HttpURLConnection、HttpClient(已废弃)或第三方库如Volley、OkHttp等。以OkHttp为例,它是一个高效的HTTP客户端,支持异步和同步请求。创建一个...

    Android 文件上传Demo

    在Android平台上,文件...以上内容是关于Android文件上传的基本原理和步骤,实际应用中可能还需要根据业务需求进行定制化开发,如添加身份验证、权限控制等。如果你对附件中的代码有任何疑问,可以进一步研究和学习。

    CXF之二(上传及下载附件)

    在客户端,我们需要创建一个Multipart请求,通常使用`HttpURLConnection`或者第三方库如Apache HttpClient或OkHttp。客户端需要构造一个包含文件的`multipart/form-data`请求,并设置正确的边界。 5. **文件下载...

    Android图片上传队列Service

    队列的引入是为了避免并发问题,防止因为网络不稳定或服务器限制导致的上传失败,同时提供了一种在后台进行上传的机制,不影响用户界面的正常运行。 1. **服务(Service)组件**:在Android中,Service是用于执行长...

    HTTP PUT相关资料

    这个压缩包文件包含了关于如何在Java中使用HttpURLConnection实现PUT请求的相关资料,包括在Stack Overflow上遇到的问题和解决方案。 首先,`java - How to send PUT, DELETE HTTP request in HttpURLConnection ...

    android上传文件,java服务器接收 客户端与服务器端两端上传代码

    可以使用`HttpURLConnection`或者第三方库如`Volley`、`OkHttp`等。 2. **文件读取**:使用`FileInputStream`读取本地文件内容,将其转换为字节数组或流形式。 3. **设置请求头**:在HTTP请求头中设置`Content-...

    Android应用源码之仿QQ邮箱安卓客户端项目.zip

    - 网络请求:使用HttpURLConnection或OkHttp进行网络通信,向服务器发送登录请求。 2. **邮件收发模块**: - IMAP/POP3协议:邮件收发通常基于IMAP或POP3协议,需理解这两种协议的工作原理。 - XML/JSON解析:...

    apache-mime4j-0.6.jar and httpmime-4.0.1.jar.zip

    在Android开发中,由于内置的HttpURLConnection在某些情况下可能不够灵活或者功能不足,许多开发者倾向于使用Apache HttpClient。尤其是在处理文件上传时,HttpMime库能够与HttpClient完美配合,提供更加高效的解决...

    安卓在调用http所有相关的jar包

    - **错误处理**:在处理网络请求时,必须考虑网络异常、服务器错误等各种可能的异常情况,并提供合适的错误处理和反馈机制。 总之,这个压缩包提供了Android开发者进行HTTP通信所需的重要工具,通过理解和掌握这些...

    Java编程案例精解素材.rar

    在Java中,可以使用HttpURLConnection或HttpClient类来创建代理服务器。这个案例可能涉及到HTTP协议的理解,请求和响应的解析,以及如何转发请求和响应。 4. **在线相册系统**:构建一个在线相册系统会涵盖数据库...

    31个java工具类大汇总

    文件上传通常涉及HTTP请求,可以使用`java.net.URL`和`java.net.HttpURLConnection`,或者使用Apache HttpClient或OkHttp库。下载文件则可以通过输入流和输出流实现。对于大文件,可能会涉及到分块上传和断点续传。...

    基于Java的手机与计算机互发彩信源码.zip

    6. **错误处理与重试机制**:由于网络环境的不稳定,发送彩信可能会遇到失败,因此在代码中加入适当的错误处理和重试机制是必要的。例如,可以设置超时、重试次数限制,以及在网络恢复后自动重新发送未成功的彩信。 ...

Global site tag (gtag.js) - Google Analytics