`
tonysmith
  • 浏览: 175665 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java利用HttpURLConnection发送post请求上传文件

阅读更多
在页面里实现上传文件不是什么难事,写个form,加上enctype = "multipart/form-data",在写个接收的就可以了,没什么难的,如果要用java.net.HttpURLConnection来实现文件上传,还真有点搞头.:-)

  1.先写个servlet把接收到的 HTTP 信息保存在一个文件中, 看一下 form 表单到底封装了什么样的信息。

  Java代码

  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里如下

  Java代码

  -----------------------------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来实现上传文件功能了

  Java代码
public void upload(List fileList) {

  List list = fileList;//new ArrayList(); // 要上传的文件名,如:d:\haha.doc.你要实现自己的业务。我这里就是一个空list.

  try {

   String BOUNDARY = &quot;---------7d4a6d158c9&quot;; // 定义数据分隔线

   URL url = new URL(&quot;http://localhost/JobPro/upload.do&quot;);

   HttpURLConnection conn = (HttpURLConnection) url.openConnection();

   // 发送POST请求必须设置如下两行

   conn.setDoOutput(true);

   conn.setDoInput(true);

   conn.setUseCaches(false);

   conn.setRequestMethod(&quot;POST&quot;);

   conn.setRequestProperty(&quot;connection&quot;, &quot;Keep-Alive&quot;);

   conn.setRequestProperty(&quot;user-agent&quot;,
     &quot;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)&quot;);

   conn.setRequestProperty(&quot;Charsert&quot;, &quot;UTF-8&quot;);

   conn.setRequestProperty(&quot;Content-Type&quot;,
     &quot;multipart/form-data; boundary=&quot; + BOUNDARY);

   OutputStream out = new DataOutputStream(conn.getOutputStream());

   byte[] end_data = (&quot;\r\n--&quot; + BOUNDARY + &quot;--\r\n&quot;).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();

}

}
分享到:
评论

相关推荐

    Java利用HttpURLConnection发送post请求上传文件.docx

    在Java编程中,发送POST请求并上传文件是一个常见的任务,特别是在与服务器进行数据交互时。在本场景中,我们使用`HttpURLConnection`类来实现这一功能。`HttpURLConnection`是Java标准库提供的一种网络连接接口,它...

    JAVA通过HttpURLConnection 上传和下载文件的方法

    JAVA通过HttpURLConnection上传和下载文件的方法 JAVA通过HttpURLConnection上传和下载文件的方法是非常有实用价值的,需要的朋友可以参考下。HttpURLConnection是一个Java类,用于从网络中读取数据或向网络中写入...

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

    对于POST请求,我们通常使用多部分/形式数据(Multipart/form-data)编码来传输文件,这是HTML表单上传文件的标准方式。 1. **配置连接**: 在Java中,我们首先创建HttpURLConnection实例,设置连接属性,例如设置...

    JAVA发送POST请求,如何使用JAVA发送POST请求

    如果您正在寻找一份JAVA客户端发送POST请求的示例代码,那么我们的资源库将为您提供一切所需。本资源库提供了一份完整的JAVA客户端发送POST请求的示例代码,可以帮助您快速了解如何使用JAVA客户端发送POST请求,同时...

    java实现多次HttpURLConnection共享session

    在Java编程中,HTTPURLConnection是Java标准库提供的一种用于处理HTTP连接的类,它允许我们发送HTTP请求并接收响应。然而,HTTP协议本身是无状态的,这意味着每次请求都是独立的,不会记住之前的交互,这对于需要...

    java代码发送JSON格式的httpPOST请求

    下面将详细解析如何利用`HttpURLConnection`来构建并发送一个包含JSON数据的POST请求: ```java import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io....

    java中main方法发送httpPost请求

    首先,Java中发送HTTP POST请求通常会用到`HttpURLConnection`类或者第三方库如Apache HttpClient或OkHttp。下面我们将主要使用`HttpURLConnection`来演示,因为它内置在JDK中,无需额外引入依赖。 1. **创建HTTP...

    java支持https的Post请求

    接下来,我们可以使用`HttpURLConnection`或第三方库如Apache HttpClient来发送POST请求。以下是一个使用`HttpURLConnection`的例子: ```java import java.io.OutputStream; import java.net.HttpURLConnection; ...

    java后台实现 get post 提交.zip

    在Java中,我们可以使用`HttpURLConnection`或者第三方库如Apache HttpClient或Spring的RestTemplate来实现POST请求。以下是一个使用`HttpURLConnection`的POST请求示例: ```java import java.io.OutputStream; ...

    java发送http/https请求(get/post)代码

    本文将详细讲解如何使用Java发送GET和POST请求,以及涉及的HTTPS安全连接。 首先,理解HTTP和HTTPS的区别至关重要。HTTP(超文本传输协议)是一种用于分发超媒体信息的应用层协议,而HTTPS(超文本传输安全协议)是...

    android使用Java原生httpUrlConnection进行get请求

    在myHttpUrlConnection这个文件中,可能包含了一个示例的HttpURLConnection GET请求的实现,你可以参考并学习其中的代码结构和逻辑。在实际项目中,考虑到性能和易用性,建议使用更高级的网络库,如Volley或OkHttp,...

    java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)

    `HttpURLConnection`是Java标准库提供的一种轻量级的HTTP客户端,它允许我们在后台代码中发送GET和POST请求。本篇文章将深入讲解如何使用`HttpURLConnection`类来模拟浏览器请求,并通过实例展示其在接口调用中的...

    Java 发送http请求上传文件功能实例

    本文将通过实例代码介绍 Java 发送 HTTP 请求上传文件功能,涵盖了发送 GET 请求、发送 POST 请求、上传文件等内容。下面是详细的知识点说明: 发送 GET 请求 在 Java 中,发送 GET 请求可以使用 `java.net.URL` ...

    java post文件流的操作

    根据提供的文件信息,...以上就是从给定文件的标题、描述、标签以及部分内容中总结出来的知识点,涵盖了Java POST请求发送与接收文件流的基础操作以及Spring MVC中处理文件上传的相关内容。希望这些信息对你有所帮助。

    Java Https工具类,Java Https Post请求

    这个“Java Https工具类,Java Https Post请求”可能是一个自定义的类,用于简化发送HTTPS POST请求的过程。以下是对这个主题的详细讲解: 1. **HTTPS基础**: - HTTPS是在HTTP上添加了SSL/TLS(Secure Sockets ...

    HttpURLConnection文件下载\httpURLConnection文件下载

    通过设置`setDoOutput(true)`表明这是一个POST请求,但实际上对于文件下载,通常使用GET请求。然后通过`connect()`方法建立连接。 `setConnectTimeout()`和`setReadTimeout()`可以设置超时时间,防止在网络状况差时...

    java发送http/https请求(get/post)Demo,亲测可用

    这里我们将深入探讨如何使用Java发送GET和POST请求,以及处理JSON数据。 首先,让我们关注GET请求。GET请求主要用于从服务器获取资源,其参数通常包含在URL中。在Java中,可以使用`HttpURLConnection`类或者第三方...

    Http学习之使用HttpURLConnection发送post和get请求 android

    本篇文章主要聚焦于使用`HttpURLConnection`类...总结,本文介绍了使用`HttpURLConnection`在Android中发送GET和POST请求的基本步骤,以及需要注意的关键点。理解这些概念有助于开发者在构建网络功能时做出明智的选择。

    本示例使用HttpUrlConnection实现上传文件

    2. **设置请求方法**:因为上传文件属于POST请求,所以我们需要设置请求方法为`POST`。 ```java connection.setRequestMethod("POST"); ``` 3. **启用输出流**:由于我们要发送数据,所以需要设置`setDoOutput...

    使用HttpUrlConnection实现上传文件 服务器端代码

    在Java编程环境中,当需要与Web服务器交互,例如上传文件时,`HttpURLConnection`是一个常见的选择,因为它提供了灵活且高效的方式。本篇文章将详细讲解如何使用`HttpURLConnection`实现文件上传,同时涉及到服务器...

Global site tag (gtag.js) - Google Analytics