本文要用java.net.HttpURLConnection来实现多个文件上传
1. 研究 form 表单到底封装了什么样的信息发送到servlet。
假如我参数写的内容是hello word,然后二个文件是二个简单的txt文件,form提交的信息为:
Content-Disposition: form-data; name="username"
hello word
-----------------------------7da2e536604c8
Content-Disposition: form-data; name="file1"; filename="D:/haha.txt"
Content-Type: text/plain
haha
hahaha
-----------------------------7da2e536604c8
Content-Disposition: form-data; name="file2"; filename="D:/huhu.txt"
Content-Type: text/plain
messi
huhu
-----------------------------7da2e536604c8--
研究下规律发现有如下几点特征
1.第一行是“ -----------------------------7d92221b604bc ”作为分隔符,然后是“ /r/n ” 回车换行符。 这个7d92221b604bc 分隔符浏览器是随机生成的。
2.第二行是Content-Disposition: form-data; name="file2"; filename="D:/huhu.txt";name=对应input的name值,filename对应要上传的文件名(包括路径在内),
3.第三行如果是文件就有Content-Type: text/plain;这里上传的是txt文件所以是text/plain,如果上穿的是jpg图片的话就是image/jpg了,可以自己试试看看。
然后就是回车换行符。
4.在下就是文件或参数的内容或值了。如:hello word。
5.最后一行是-----------------------------7da2e536604c8--,注意最后多了二个--;
有了这些就可以使用HttpURLConnection来实现上传文件功能了
private void upload(String[] uploadFiles, String actionUrl) {
String end = "/r/n";
String twoHyphens = "--";
String boundary = "*****";
try {
URL url = new URL(actionUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// 发送POST请求必须设置如下两行
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
DataOutputStream ds =
new DataOutputStream(con.getOutputStream());
for (int i = 0; i < uploadFiles.length; i++) {
String uploadFile = uploadFiles[i];
String filename = uploadFile.substring(uploadFile.lastIndexOf("//") + 1);
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data; " +
"name=/"file" + i + "/";filename=/"" +
filename + "/"" + end);
ds.writeBytes(end);
FileInputStream fStream = new FileInputStream(uploadFile);
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int length = -1;
while ((length = fStream.read(buffer)) != -1) {
ds.write(buffer, 0, length);
}
ds.writeBytes(end);
/* close streams */
fStream.close();
}
ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
ds.flush();
// 定义BufferedReader输入流来读取URL的响应
InputStream is = con.getInputStream();
int ch;
StringBuffer b = new StringBuffer();
while ((ch = is.read()) != -1) {
b.append((char) ch);
}
String s = b.toString();
if (s.contains("successfully")) {
// for (int i = 1; i < 5; i++) {
int beginIndex = s.indexOf("url =") + 5;
int endIndex = s.indexOf("/n", beginIndex);
String urlStr = s.substring(beginIndex, endIndex).trim();
System.out.println(urlStr);
// }
}
ds.close();
} catch (Exception e) {
}
}
分享到:
相关推荐
在Java编程中,发送POST请求并上传文件是一个常见的任务,特别是在与服务器进行数据交互时。在本场景中,我们使用`HttpURLConnection`类来实现这一功能。`HttpURLConnection`是Java标准库提供的一种网络连接接口,它...
总结来说,Java实现多次HttpURLConnection共享session的关键在于正确处理Cookie,保存服务器返回的Session ID,并在后续请求中携带这个ID。通过这种方式,即使没有浏览器环境,也能模拟登录状态,爬取登录后的内容。...
在处理文件上传时,我们通常需要设置请求方法为POST或PUT,并使用`setDoOutput(true)`开启输出流,以便向服务器发送数据。 Servlet是Java Web开发中的重要组件,用于接收和响应HTTP请求。在处理文件上传时,Servlet...
本篇文章主要聚焦于使用`HttpURLConnection`类...总结,本文介绍了使用`HttpURLConnection`在Android中发送GET和POST请求的基本步骤,以及需要注意的关键点。理解这些概念有助于开发者在构建网络功能时做出明智的选择。
- **并发上传**:如果需要上传多个文件,可以考虑使用线程或异步任务来实现并发上传。 通过理解以上步骤和注意事项,开发者可以有效地利用HttpURLConnection在Android应用中实现代理文件上传功能。同时,了解服务器...
- 解析请求,`ServletFileUpload.parseRequest(request)`将返回一个`FileItemIterator`,可以遍历每个上传的文件或表单字段。 - 对于每个`FileItemStream`,我们可以获取文件名,打开输入流,然后将内容保存到...
对于POST请求,我们通常使用多部分/形式数据(Multipart/form-data)编码来传输文件,这是HTML表单上传文件的标准方式。 1. **配置连接**: 在Java中,我们首先创建HttpURLConnection实例,设置连接属性,例如设置...
这个简单的示例对于初学者理解Android中使用`HttpURLConnection`发送POST请求非常有用,但实际应用中可能还需要考虑其他因素,如错误处理、HTTPS支持、多线程请求等。记住,网络操作应在子线程中进行,以避免阻塞UI...
通过设置`setDoOutput(true)`表明这是一个POST请求,但实际上对于文件下载,通常使用GET请求。然后通过`connect()`方法建立连接。 `setConnectTimeout()`和`setReadTimeout()`可以设置超时时间,防止在网络状况差时...
4. **设置输出流**:POST请求需要通过输出流写入数据,调用`setDoOutput(true)`。 5. **设置请求属性**:可能需要设置`Content-Type`(例如`application/octet-stream`,表明上传的是二进制数据),以及`Content-...
根据提供的文件信息,...以上就是从给定文件的标题、描述、标签以及部分内容中总结出来的知识点,涵盖了Java POST请求发送与接收文件流的基础操作以及Spring MVC中处理文件上传的相关内容。希望这些信息对你有所帮助。
`httpURLConnectionPOST()`方法展示了POST请求的处理方式,通过设置`setDoOutput(true)`开启输出流,但示例中并未写入实际的POST数据。 在实际应用中,可能需要添加更多的配置,比如设置请求头(如`Content-Type`,...
总结来说,Android发送POST请求获取JSON字符串涉及到网络请求的实现、参数封装、请求发送、JSON解析以及错误处理等多个环节。选择合适的网络库能提高效率,而合理处理服务器返回的数据则能提升用户体验。在实际项目...
实际项目中,可能需要根据需求进行更多的定制,如处理POST请求、添加请求头、使用异步请求等。 总结,`HttpURLConnection`虽然基础,但在现代应用中可能显得不够灵活。相比之下,`OKHttp`提供了更高级的功能,更...
在提供的`PostRequestDemo`文件中,可能包含了具体的POST请求实现示例,你可以查阅这些代码,加深对Android原生POST请求的理解。如果遇到问题,可以参考上述步骤或访问链接中的博客文章获取更多信息。
多文件上传通常采用Multipart形式,如HTTP的POST请求。Android的`HttpURLConnection`或第三方库如Volley、Retrofit都可以处理这种请求。Multipart数据包含一个或多个部分,每个部分包含文件的二进制数据和元数据(如...
在Android开发中,联网请求是应用与...理解这两种方法的工作原理以及如何处理GET和POST请求,是每个Android开发者必备的技能。在实际开发中,还可以结合使用第三方库,如Retrofit、OkHttp等,以简化网络请求的处理。
以下是一个使用HttpClient发送POST请求的例子: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("https://example.com"); List<NameValuePair> params ...
综上所述,利用HttpURLConnection进行数据采集涉及到网络编程、HTTP协议、HTML解析、正则表达式、多线程以及良好的编程设计原则等多个方面。在实际项目中,还需要考虑异常处理、性能优化、数据存储和安全性等问题,...
在实际请求前,代码设置了多个请求头字段,如接受的语言、字符集、连接保持活动状态等,这有助于优化网络传输和服务器资源的利用。 ```java httpUrlConnection.setRequestMethod("GET"); httpUrlConnection....