Java 中HttpURLConnection附件上传的实例详解

Java 中HttpURLConnection附件上传的实例详解

整合了一个自己写的采用Http做附件上传的工具,分享一下!

示例代码:

/**
 * 以Http协议传输文件
 *
 * @author mingxue.zhang@163.com
 *
 */
public class HttpPostUtil { 

  private final static char[] MULTIPART_CHARS = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
      .toCharArray(); 

  private URL url;
  private HttpURLConnection conn;
  private String boundary = null;
  private Map<String, String> textParams = new HashMap<String, String>();
  private Map<String, File> fileparams = new HashMap<String, File>(); 

  public HttpPostUtil(String url) throws Exception {
    this.url = new URL(url);
  } 

  // 重新设置要请求的服务器地址,即上传文件的地址。
  public void setUrl(String url) throws Exception {
    this.url = new URL(url);
  } 

  // 增加一个普通字符串数据到form表单数据中
  public void addTextParameter(String name, String value) {
    textParams.put(name, value);
  } 

  // 增加一个文件到form表单数据中
  public void addFileParameter(String name, File value) {
    fileparams.put(name, value);
  } 

  // 清空所有已添加的form表单数据
  public void clearAllParameters() {
    textParams.clear();
    fileparams.clear();
  } 

  /**
   * 发送数据到服务器
   *
   * @return 一个字节包含服务器的返回结果的数组
   * @throws Exception
   */
  public byte[] send() throws Exception {
    initConnection();
    try {
      conn.connect();
    } catch (SocketTimeoutException e) {
      throw new Exception(e);
    } 

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

    writeFileParams(connOutStream);
    writeStringParams(connOutStream);
    writesEnd(connOutStream); 

    InputStream responseInStream = conn.getInputStream();
    ByteArrayOutputStream responseOutStream = new ByteArrayOutputStream();
    int len;
    byte[] bufferByte = new byte[1024];
    while ((len = responseInStream.read(bufferByte)) != -1) {
      responseOutStream.write(bufferByte, 0, len);
    }
    responseInStream.close();
    connOutStream.close(); 

    conn.disconnect();
    byte[] resultByte = responseOutStream.toByteArray();
    responseOutStream.close();
    return resultByte;
  } 

  // 文件上传的connection的一些必须设置
  private void initConnection() throws Exception {
    StringBuffer buf = new StringBuffer("----");
    Random rand = new Random();
    for (int i = 0; i < 15; i++) {
      buf.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]);
    }
    this.boundary = buf.toString(); 

    conn = (HttpURLConnection) this.url.openConnection();
    conn.setDoOutput(true);
    conn.setUseCaches(false);
    conn.setConnectTimeout(3 * 60 * 1000); // 连接超时为10秒
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type",
        "multipart/form-data; boundary=" + boundary);
  } 

  // 普通字符串数据
  private void writeStringParams(OutputStream out) throws Exception {
    Set<String> keySet = textParams.keySet();
    for (Iterator<String> it = keySet.iterator(); it.hasNext();) {
      String name = it.next();
      String value = textParams.get(name); 

      out.write(("--" + boundary + "\r\n").getBytes());
      out.write(("Content-Disposition: form-data; name=\"" + name + "\"\r\n")
          .getBytes());
      out.write(("\r\n").getBytes());
      out.write((encode(value) + "\r\n").getBytes());
    }
  } 

  // 文件数据
  private void writeFileParams(OutputStream out) throws Exception {
    Set<String> keySet = fileparams.keySet();
    for (Iterator<String> it = keySet.iterator(); it.hasNext();) {
      String name = it.next();
      File value = fileparams.get(name); 

      out.write(("--" + boundary + "\r\n").getBytes());
      out.write(("Content-Disposition: form-data; name=\"" + name
          + "\"; filename=\"" + encode(value.getName()) + "\"\r\n")
          .getBytes());
      out.write(("Content-Type: " + getContentType(value) + "\r\n")
          .getBytes());
      out.write(("Content-Transfer-Encoding: " + "binary" + "\r\n")
          .getBytes()); 

      out.write(("\r\n").getBytes()); 

      FileInputStream inStream = new FileInputStream(value);
      int bytes = 0;
      byte[] bufferByte = new byte[1024];
      while ((bytes = inStream.read(bufferByte)) != -1) {
        out.write(bufferByte, 0, bytes);
      }
      inStream.close(); 

      out.write(("\r\n").getBytes());
    }
  } 

  // 添加结尾数据
  private void writesEnd(OutputStream out) throws Exception {
    out.write(("--" + boundary + "--" + "\r\n").getBytes());
    out.write(("\r\n").getBytes());
  } 

  // 获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream
  private String getContentType(File f) throws Exception {
    String fileName = f.getName();
    if (fileName.endsWith(".jpg")) {
      return "image/jpeg";
    } else if (fileName.endsWith(".png")) {
      return "image/png";
    }
    return "application/octet-stream";
  } 

  // 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码
  private String encode(String value) throws Exception {
    return URLEncoder.encode(value, "UTF-8");
  } 

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

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

    一般在项目开发中难免遇到外部接口的调用,本文实例讲述了java后台调用HttpURLConnection类模拟浏览器请求的方法.可用于接口调用.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package com.cplatform.movie.back.test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import ja

  • 谈谈Java利用原始HttpURLConnection发送POST数据

    URLConnection是个抽象类,它有两个直接子类分别是HttpURLConnection和JarURLConnection.另外一个重要的类是URL,通常URL可以通过传给构造器一个String类型的参数来生成一个指向特定地址的URL实例. 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络.请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close

  • Java HttpURLConnection超时和IO异常处理

    最近同步数据的时候发现了一个问题,我本身后台插入数据后给其他部门后台做同步.说简单一点其实就是调用对方提供的接口,进行HTTP请求调用.然后后面发现问题了.HTTP请求的话,有可能请求超时,中断失败,IO异常其实都有可能,如果是平时打开一个网页还好,打不开的时候,你会关掉,或者他页面给你显示信息.但是同步,不可以这样做,一旦请求失败,必须让数据正确的同步,今天才意识到这个问题的重要性. String httpUrl = "https://www.baidu.com/s?ie=UTF-8&

  • java HttpURLConnection 发送文件和字符串信息

    java HttpURLConnection 发送文件和字符串信息 以文件的形式传参 /** * 通过拼接的方式构造请求内容,实现参数传输以及文件传输 * * @param actionUrl 访问的服务器URL * @param params 普通参数 * @param files 文件参数 * @return * @throws IOException */ public static void post(String actionUrl, Map<String, String> para

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

    本文介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,分享给大家,具体如下: HttpURLConnection文件上传 HttpURLConnection采用模拟浏览器上传的数据格式,上传给服务器 上传代码如下: package com.util; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataOutputStream; import java

  • java 使用HttpURLConnection发送数据简单实例

    java 使用HttpURLConnection发送数据简单实例 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络.请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响.如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字.JAVA使用HttpURLCon

  • Java 中HttpURLConnection附件上传的实例详解

    Java 中HttpURLConnection附件上传的实例详解 整合了一个自己写的采用Http做附件上传的工具,分享一下! 示例代码: /** * 以Http协议传输文件 * * @author mingxue.zhang@163.com * */ public class HttpPostUtil { private final static char[] MULTIPART_CHARS = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJK

  • Java 文件上传的实例详解

    Java 文件上传的实例详解 java 文件上传 Java文件上传,介绍几种常用的方法,也是经过本人亲手调试过的 1.jspsmartupload 这个组件用起来是挺方便的,不过就是只适合小文件上传,如果大文件上传的话就不行,查看了一下他的代码,m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes];居然把整个上传文件都读到内存去了,那如果是上传几十M的文件,同时几个用户上传,服务器稳挂,不

  • iOS开发中以application/json上传文件实例详解

    本文通过实例代码给大家讲解iOS中以application/json上传文件的形式,具体内容详情大家参考下本文. 在和sever后台交互的过程中.有时候.他们需要我们iOS开发者以"application/json"形式上传. NSString *accessUrl = [NSString stringWithFormat:@"%@/xxx",@"https://www.xxxxx.com:xxxx"]; NSMutableURLRequest

  • java 中Excel转shape file的实例详解

    java  中Excel转shape file的实例详解 概述: 本文讲述如何结合geotools和POI实现Excel到shp的转换,再结合前文shp到geojson数据的转换,即可实现用户上传excel数据并在web端的展示功能. 截图: 原始Excel文件 运行耗时 运行结果 代码: package com.lzugis.geotools; import com.lzugis.CommonMethod; import com.vividsolutions.jts.geom.Coordina

  • 最详细的文件上传下载实例详解(推荐)

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

  • java  中Excel转shape file的实例详解

    java  中Excel转shape file的实例详解 概述: 本文讲述如何结合geotools和POI实现Excel到shp的转换,再结合前文shp到geojson数据的转换,即可实现用户上传excel数据并在web端的展示功能. 截图: 原始Excel文件 运行耗时 运行结果 代码: package com.lzugis.geotools; import com.lzugis.CommonMethod; import com.vividsolutions.jts.geom.Coordina

  • JAVA 中解密RSA算法JS加密实例详解

    JAVA 中解密RSA算法JS加密实例详解 有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决 . java代码 需要依赖 commons-codec 包 RSACoder.Java import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.

  • Java中JDBC实现动态查询的实例详解

    一 概述 1.什么是动态查询? 从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询. 2.动态查询的难点 可供选择的查询条件多,组合情况多,难以一一列举. 3.最终查询语句的构成 一旦用户向查询条件中输入数据,该查询条件就成为最终条件的一部分. 二 基本原理 1.SQL基本框架 无论查询条件如何,查询字段与数据库是固定不变的,这些固定不变的内容构成SQL语句的基本框架,如 select column... from table. 2.StringBuilder形成D

  • java中 String和StringBuffer的区别实例详解

    java中 String和StringBuffer的区别实例详解 String: 是对象不是原始类型.            为不可变对象,一旦被创建,就不能修改它的值.            对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.            String 是final类,即不能被继承. StringBuffer: 是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象            它只能通过构造函数来建立,  

  • Java中常见死锁与活锁的实例详解

    本文介绍了Java中常见死锁与活锁的实例详解,分享给大家,具体如下: 顺序死锁:过度加锁,导致由于执行顺序的原因,互相持有对方正在等待的锁 资源死锁:多个线程在相同的资源上发生等待 由于调用顺序而产生的死锁 public class Test { Object leftLock = new Object(); Object rightLock = new Object(); public static void main(String[] args) { final Test test = ne

随机推荐