网上介绍了很多使用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校验结果也是相同的, 我实在是找不出什么办法了, 求各位大神提点.
相关推荐
本示例使用HttpUrlConnection实现上传文件,可以将手机上的文件上传到服务器 必须与my_upload工程配合运行,先启动my_upload工程
使用HttpUrlConnection实现上传文件服务器端代码,引用commons-fileupload-1.2.1.jar、commons-io-1.4.jar
使用HttpURLConnection发送短信
在 Android 中对 HttpURLConnection 的简单使用,仅供参考。
正文:我在使用HttpURLConnection.getResponseCode()的时候直接报错是IOException错误,responseCode = -1。一直想不明白,同一个程序我调用了两次,结果有一个链接一直OK,另一个却一直报这个错误。后来发现两个...
一个简单的例子,使用HttpURLConnection下载图片
这个demo是Android使用HttpURLConnection上传图片到服务器
主要介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,非常具有实用价值,需要的朋友可以参考下
使用HttpURLConnection实现断点续传
主要介绍了Java 中HttpURLConnection附件上传的实例详解的相关资料,希望通过本文大家能掌握这样的知识内容,需要的朋友可以参考下
HttpURLConnection使用总结示例源码
Android使用HttpURLConnection访问网络
使用HttpURLConnection或HttpClient方式传json值到spring中
Android HttpUrlConnection使用方法 post and get json.
HttpUrlConnection 用Post方式提交请求 ,我找的不容易,需要的时候很重要
HttpURLConnection的demo,里面有网络请求get post 上传文件,下载文件,介绍HttpURLConnection这个类整体流程是怎样使用的,方便初学者学习
HttpURLConnection文件下载\httpURLConnection文件下载
Java自带的HttpURLConnection访问接口文件上传, 含普通参数值传递和文件传递
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。
实例Demo程序来示范使用HttpURLConnection实现多线程下载。 使用多线程下载文件可以更快完成文件的下载,因为客户端启动多条线程进行下载就意味着服务器也需要为该客户端提供响应的服务。假设服务器同时最多服务100...