网上介绍了很多使用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实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...
在Android应用开发中,将附件(如图片文件)上传到服务器是常见的功能需求。这个场景通常涉及到网络通信,特别是HTTP协议的使用。本篇将详细讲解如何在Android中实现图片文件的HTTP上传。 首先,我们需要了解HTTP...
6. **HTTP请求**:Java可以使用HttpURLConnection或者第三方库如Apache HttpClient或OkHttp来发起HTTP请求,实现文件的POST(上传)和GET(下载)操作。 7. **JSON序列化与反序列化**:与QQ服务器交互时,通常需要...
文件上传通常涉及到网络请求,Android提供了多种方式来实现,如使用HttpURLConnection、HttpClient(已废弃)或第三方库如Volley、OkHttp等。以OkHttp为例,它是一个高效的HTTP客户端,支持异步和同步请求。创建一个...
在Android平台上,文件...以上内容是关于Android文件上传的基本原理和步骤,实际应用中可能还需要根据业务需求进行定制化开发,如添加身份验证、权限控制等。如果你对附件中的代码有任何疑问,可以进一步研究和学习。
在客户端,我们需要创建一个Multipart请求,通常使用`HttpURLConnection`或者第三方库如Apache HttpClient或OkHttp。客户端需要构造一个包含文件的`multipart/form-data`请求,并设置正确的边界。 5. **文件下载...
队列的引入是为了避免并发问题,防止因为网络不稳定或服务器限制导致的上传失败,同时提供了一种在后台进行上传的机制,不影响用户界面的正常运行。 1. **服务(Service)组件**:在Android中,Service是用于执行长...
这个压缩包文件包含了关于如何在Java中使用HttpURLConnection实现PUT请求的相关资料,包括在Stack Overflow上遇到的问题和解决方案。 首先,`java - How to send PUT, DELETE HTTP request in HttpURLConnection ...
可以使用`HttpURLConnection`或者第三方库如`Volley`、`OkHttp`等。 2. **文件读取**:使用`FileInputStream`读取本地文件内容,将其转换为字节数组或流形式。 3. **设置请求头**:在HTTP请求头中设置`Content-...
- 网络请求:使用HttpURLConnection或OkHttp进行网络通信,向服务器发送登录请求。 2. **邮件收发模块**: - IMAP/POP3协议:邮件收发通常基于IMAP或POP3协议,需理解这两种协议的工作原理。 - XML/JSON解析:...
在Android开发中,由于内置的HttpURLConnection在某些情况下可能不够灵活或者功能不足,许多开发者倾向于使用Apache HttpClient。尤其是在处理文件上传时,HttpMime库能够与HttpClient完美配合,提供更加高效的解决...
- **错误处理**:在处理网络请求时,必须考虑网络异常、服务器错误等各种可能的异常情况,并提供合适的错误处理和反馈机制。 总之,这个压缩包提供了Android开发者进行HTTP通信所需的重要工具,通过理解和掌握这些...
在Java中,可以使用HttpURLConnection或HttpClient类来创建代理服务器。这个案例可能涉及到HTTP协议的理解,请求和响应的解析,以及如何转发请求和响应。 4. **在线相册系统**:构建一个在线相册系统会涵盖数据库...
文件上传通常涉及HTTP请求,可以使用`java.net.URL`和`java.net.HttpURLConnection`,或者使用Apache HttpClient或OkHttp库。下载文件则可以通过输入流和输出流实现。对于大文件,可能会涉及到分块上传和断点续传。...
6. **错误处理与重试机制**:由于网络环境的不稳定,发送彩信可能会遇到失败,因此在代码中加入适当的错误处理和重试机制是必要的。例如,可以设置超时、重试次数限制,以及在网络恢复后自动重新发送未成功的彩信。 ...