• 技术文章 >Java >java教程

    Java中关于HttpURLConnection附件上传详解

    黄舟黄舟2017-09-18 09:51:26原创745
    这篇文章主要介绍了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"); 
      } 
    }

    以上就是Java中关于HttpURLConnection附件上传详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:Java如何调用.NET中WebService的实例 下一篇:Java排序数索引功能使用分治算法实现的示例
    Web大前端开发直播班

    相关文章推荐

    • Java技巧总结之如何看Lambda源码• 完全掌握Java单例模式• JAVA详细解析之IO流、File、字节流以及字符流• JAVA学习IO操作之字节流和字符流(总结分享)• JAVA面向对象之继承、构造方法、重写和重载(总结分享)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网