`
tonysmith
  • 浏览: 171289 次
  • 性别: 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利用HttpURLConnection发送post请求上传文件

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

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

    java实现多次HttpURLConnection共享session

    java实现多次HttpURLConnection共享session,发送两次请求共享同一个session,这样做爬虫的时候就可以爬网站登录后能看到的内容了

    java网络请求工具类 HttpURLConnection

    java网络请求工具类 HttpURLConnection post请求工具类HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setRequestMethod("POST");// 提交模式

    HttpUrlConnection请求WebService.rar

    Java原生HttpUrlConnection访问WebService实例,附相关jar包...新手整理不喜勿喷

    Java实现批量下载并压缩文件.pptx.pptx

    Java中可以使用HttpURLConnection或者Apache HttpClient等工具类进行文件下载,通过设置请求头和请求参数,发送get或post请求获取文件。 使用Java压缩多个文件为zip包 Java中可以使用ZipOutputStream类将多个文件...

    通过HttpURLConnection获取SESSIONID

    import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.Map; public class HttpTest { private HttpURLConnection hc = ...

    java_android_HttpURLConnection网络l连接工具类的标准代码

    一些工具类代码块的标准代码: 异步的Get请求 异步的Post请求 Get请求,获得返回数据 向指定 URL 发送POST方法的请求 使用finally块来关闭输出流和输入流

    Java多线程与线程安全实践-基于Http协议的断点续传

    使用Java的HttpURLConnection类连接到服务器,并发送GET请求获取要下载的文件的基本信息,包括文件名、文件大小等。 2.2 分块下载 将要下载的文件分成多个块,每个块使用一个线程进行下载。每个线程需要记录已下载...

    Java发https请求证书问题

    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod( "POST"); connection.setDoOutput(true); connection.setDoInput(true); System.out.println( "1-...

    HttpAgent:Android网络请求框架,可以自定义网络引擎,支持GET,POST,文件上传,可以监听文件上传进度

    HttpAgent Android网络请求框架,可以自定义网络引擎,支持GET,POST,文件上传,文件下载,可以监听文件下载上传进度。本库内部基于OkHttp和HttpUrlConnection实现了两套网络请求逻辑,使用者可以根据自己的需要...

    android post请求接口demo

    本文实例为大家分享了android post请求接口demo测试代码,供大家参考,具体内容如下 MainActivity.java package com.tsh.test; import java.io.InputStream; import java.io.OutputStream; import java.io....

    怎么向服务器提交用户名密码等数据

    用GET还是POST 提交数据用POST 打开输入和输出流 获取上传信息 字节大小以及长度 设置请求体的类型是文本类型 获得输出流 向服务器输出数据 获得服务器响应的结果和状态码 如果 返回码等于200 得到服务器返回的输入...

    Android-Networking:用于异步执行 HttpGet、HttpPost、HttpPut、HttpDelete、Multipart-Put、Multipart-Post 和带有回调的 HttpUrlConnection 的库

    用于异步执行 HttpGet、HttpPost、HttpPut、HttpDelete、Multipart-Put、Multipart-Post 和带有回调的 HttpUrlConnection 的库。 简化网络通信所需的代码量。 兼容 Android 2.2 及以上版本。 特征 兼容Android 2.2 ...

    android http通信demo

    android 当中涉及到网络编程的部分经常会用到http通信,同时android也为我么您...前面提到的HttpUrlConnection接口是java当中的通信接口,而HttpClient则是java当中自带的通信接口。这个demo就实现了这四种通信方式。

    HttpClient

    安卓开发 网络请求实现类,包括HttpClient get/post 请求,和 HttpUrlConnection的操作!

    Android典型技术模块开发详解

    15.3.1 发送文件 15.3.2 接收文件 15.4 本章小结 第16章 程序优化 16.1 Java内存管理 16.1.1 垃圾回收 16.1.2 内存分配 16.2 Android优化 16.2.1 内存分配跟踪Allocation Tracker 16.2.2 内存监控Heap 16.2.3 内存...

    精通ANDROID 3(中文版)1/2

    11.1.2 将HttpClient用于HTTPPOST请求(多部分POST请求示例)  11.1.3 SOAP、JSON和XML分析程序  11.1.4 处理异常  11.1.5 解决多线程问题  11.1.6 有趣的超时  11.1.7 使用HttpURLConnection  11.1.8 ...

    精通Android 3 (中文版)2/2

    11.1.2 将HttpClient用于HTTPPOST请求(多部分POST请求示例)  11.1.3 SOAP、JSON和XML分析程序  11.1.4 处理异常  11.1.5 解决多线程问题  11.1.6 有趣的超时  11.1.7 使用HttpURLConnection  11.1.8 ...

    HttpClient以及获取页面内容应用

    如果需要发送POST请求,创建HttpPost对象。 //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的 http换成https HttpMethod method = new GetMethod("http://www.baidu.com"); //使用POST方法 ...

Global site tag (gtag.js) - Google Analytics