在页面里实现上传文件不是什么难事,写个form,加上enctype
=
"multipart/form-data",在写个接收的就可以了,没什么难的,如果要用java.net.HttpURLConnection来实现文件上传,还真有点搞头.:-)
1.先写个servlet把接收到的
HTTP
信息保存在一个文件中,
看一下
form
表单到底封装了什么样的信息。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取输入流,是HTTP协议中的实体内容
ServletInputStream in=request.getInputStream();
//缓冲区
byte buffer[]=new byte[1024];
FileOutputStream out=new FileOutputStream("d:\\test.log");
int len=sis.read(buffer, 0, 1024);
//把流里的信息循环读入到file.log文件中
while( len!=-1 ){
out.write(buffer, 0, len);
len=in.readLine(buffer, 0, 1024);
}
out.close();
in.close();
}
来一个form表单。
<form name="upform" action="upload.do" method="POST"
enctype="multipart/form-data">
参数<input type="text" name="username"/><br/>
文件1<input type="file" name="file1"/><br/>
文件2<input type="file" name="file2"/><br/>
<input type="submit" value="Submit" />
<br />
</form>
假如我参数写的内容是hello word,然后二个文件是二个简单的txt文件,上传后test.log里如下
-----------------------------7da2e536604c8
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来实现上传文件功能了
public void upload(){
List<String> list = new ArrayList<String>(); //要上传的文件名,如:d:\haha.doc.你要实现自己的业务。我这里就是一个空list.
try {
String BOUNDARY = "---------7d4a6d158c9"; // 定义数据分隔线
URL url = new URL("http://localhost/JobPro/upload.do");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
OutputStream out = new DataOutputStream(conn.getOutputStream());
byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();// 定义最后数据分隔线
int leng = list.size();
for(int i=0;i<leng;i++){
String fname = list.get(i);
File file = new File(fname);
StringBuilder sb = new StringBuilder();
sb.append("--");
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"file"+i+"\";filename=\""+ file.getName() + "\"\r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");
byte[] data = sb.toString().getBytes();
out.write(data);
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
out.write("\r\n".getBytes()); //多个文件时,二个文件之间加入这个
in.close();
}
out.write(end_data);
out.flush();
out.close();
// 定义BufferedReader输入流来读取URL的响应
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}
}
至于接收文件上传,可以浏览本博客中文章利用commons-fileupload
实现文件上传终极版及commons-fileupload和commons-io包关系
分享到:
相关推荐
在Java编程中,发送POST请求并上传文件是一个常见的任务,特别是在与服务器进行数据交互时。在本场景中,我们使用`HttpURLConnection`类来实现这一功能。`HttpURLConnection`是Java标准库提供的一种网络连接接口,它...
2. **设置请求方法**:因为上传文件属于POST请求,所以我们需要设置请求方法为`POST`。 ```java connection.setRequestMethod("POST"); ``` 3. **启用输出流**:由于我们要发送数据,所以需要设置`setDoOutput...
5. **发起请求**:使用HTTP库(如Python的requests库,Java的HttpURLConnection,或C#的HttpClient)发送POST请求。确保设置好URL、请求头和请求体。 6. **处理响应**:服务器接收到请求后,会返回一个响应。根据...
下面我们将详细讨论如何利用HttpURLConnection上传图片。 首先,我们需要获取到用户选择或拍摄的图片。这通常通过Intent来完成,例如启动系统的相机应用或者文件选择器,让用户选择本地图片。一旦图片被选定,可以...
这个类允许我们与远程服务器进行各种HTTP通信,包括发送GET、POST请求,上传文件,以及处理响应。在远程连接服务器的过程中,`HttpURLConnection`扮演着至关重要的角色。 首先,我们要理解`HttpURLConnection`的...
在本文中,我们将深入探讨如何利用HttpURLConnection实现文件上传和接收的功能。 首先,我们看客户端(发送文件)的实现: 1. 创建URL对象,指定上传文件的服务器地址和文件名参数,例如:`...
多文件上传通常采用Multipart形式,如HTTP的POST请求。Android的`HttpURLConnection`或第三方库如Volley、Retrofit都可以处理这种请求。Multipart数据包含一个或多个部分,每个部分包含文件的二进制数据和元数据(如...
2. 网络通信:通过`HttpURLConnection`发送POST请求,实现文件上传。 3. 请求头设置:正确设置Content-Type,指定上传数据的类型。 4. 异步处理:使用异步任务或线程池避免阻塞UI线程。 5. 文件选择:利用`Intent`...
例如,JavaScript中的fetch API或jQuery的$.ajax,Python的requests库,Java的HttpURLConnection或OkHttp库,它们都提供了便捷的接口来发送GET和POST请求。 当涉及文件上传时,POST请求特别有用。例如,使用...
文件上传通常采用`POST`方法,通过`multipart/form-data`编码方式来发送数据。这种编码方式允许在请求体中包含多个部分,每个部分之间用一个特定的分隔符(即`boundary`)来区分。文件部分通常包含文件名、文件类型...
文件上传是通过POST请求实现的,其中文件以多部分/表单数据格式发送。在创建请求时,需要设置请求方法为POST,并开启允许上传数据的功能。 2. **文件读取**:在上传文件之前,需要先将文件内容读入内存。Android...
4. **写入请求数据**:对于POST请求,可能需要向服务器发送数据,可以使用`getOutputStream()`获取输出流,然后写入数据。 5. **执行请求**:调用`connect()`方法建立实际的网络连接。 6. **读取响应**:通过`...
首先,Android客户端通过POST请求上传文件时,可以使用`HttpURLConnection`或`OkHttp`库。`HttpURLConnection`是Android系统自带的API,而`OkHttp`则是一个第三方库,提供了更方便、高效的网络通信方式。无论是哪种...
本篇文章将详细讲解如何利用`HttpURLConnection`类来实现在Android设备上实现文件的HTTP上传。 首先,我们需要了解`HttpURLConnection`是Java SDK中的一个基础网络通信组件,它提供了HTTP协议的支持。在Android中,...
Android端的实现涉及到使用HttpURLConnection或Retrofit等网络库来发送POST请求,携带文件数据。关键步骤包括: - 文件读取:使用`openFileInput()`或`getAssets().open()`读取本地文件。 - 创建RequestBody:...
3. 使用HTTP客户端发起POST请求,附带上传文件的数据。 4. 在请求过程中,更新界面的上传进度条或提示信息。 5. 服务器端接收到请求,解析文件数据并保存。 6. 客户端接收到服务器响应,根据状态码判断上传是否成功...
这些库提供了便捷的方法来构建POST请求,将文件作为二进制数据附在请求体中。此外,为了处理文件选择,项目可能利用了`Intent`系统,通过`ACTION_PICK`或`ACTION_GET_CONTENT`启动系统文件选择器。 在Android客户端...
- HTTP客户端:利用Android的HttpURLConnection或者第三方库如OkHttp,建立与服务器的连接,发起POST请求并将文件数据发送出去。 - 进度显示:提供UI反馈,展示文件上传进度,提升用户体验。 - 错误处理:对网络...
在文件上传时,通常会将文件转换为二进制流,然后封装在POST请求的请求体中。在本例中,由于使用了Struts2框架,因此客户端可能需要按照Struts2的ActionForm或者JSON格式来构造请求参数。 Struts2是Java领域的一款...
在文件上传的上下文中,文件被视为服务器上的一个资源,客户端通过POST请求将文件发送到服务器。 Jersey是Java的一个轻量级框架,专门用于构建RESTful服务。它提供了丰富的API和工具,使开发者能够快速地创建REST...