`

Java http请求(二) ---- 文件上传工具

    博客分类:
  • JAVA
阅读更多

http请求(二) ---- 文件上传工具

 public class FormFile {
      // 上传文件的数据
      private byte[] data;
 
     private InputStream inStream;

    // 文件名称
    private String filename;
     // 表单名称
     private String formname;
     // 内容类型
    private String contentType = "application/octet-stream";
 
    public FormFile(String filename, byte[] data, String formname,
             String contentType) {
         this.data = data;
        this.filename = filename;
         this.formname = formname;
         if (contentType != null) {
             this.contentType = contentType;
         }
     }
 
   public FormFile(String filename, InputStream inStream, String formname,
             String contentType) {
        this.filename = filename;
        this.formname = formname;
         this.inStream = inStream;
         if (contentType != null) {
             this.contentType = contentType;
         }
    }
 
     public byte[] getData() {
         return data;
     }
 
     public void setData(byte[] data) {
        this.data = data;
     }

     public InputStream getInStream() {
         return inStream;
     }

     public void setInStream(InputStream inStream) {
         this.inStream = inStream;
     }
 
    public String getFilename() {
        return filename;
    }
 
     public void setFilename(String filename) {
         this.filename = filename;
     }
 
     public String getFormname() {
         return formname;
     }

     public void setFormname(String formname) {
         this.formname = formname;
     }
 
     public String getContentType() {
         return contentType;
     }

    public void setContentType(String contentType) {
         this.contentType = contentType;
     }
 }

 

 

 public class HttpUploadRequester {
    /**
     * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能: <FORM METHOD=POST
    * ACTION="http://192.168.0.200:8080/ssi/fileload/test.do"
      * enctype="multipart/form-data"> <INPUT TYPE="text" NAME="name"> <INPUT
      * TYPE="text" NAME="id"> <input type="file" name="imagefile"/> <input
      * type="file" name="zip"/> </FORM>
    * 
     * @param actionUrl
      *            上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,
       *            你可以使用http://192.168.1.10:8080这样的路径测试)
       * @param params
      *            请求参数 key为参数名,value为参数值
       * @param file
       *            上传文件
       */
      // http协议中分割符,随便定义
      private static final String HTTP_BOUNDARY = "---------9dx5a2d578c2";
      private static final String MULTIPART_FORM_DATA = "multipart/form-data";
      private static final String LINE_ENTER = "\r\n"; // 换行 回车
      private static final int RESPONSE_OK = 200;
 
      public static String post(String urlPath, Map<String, String> params,
             FormFile[] formFiles) {
         try {
              URL url = new URL(urlPath);
              HttpURLConnection conn = (HttpURLConnection) url.openConnection();
              conn.setRequestMethod("POST");
              conn.setReadTimeout(5 * 1000);
              conn.setDoOutput(true); // 发送POST请求, 必须设置允许输出
              conn.setUseCaches(false);
             conn.setRequestProperty("Connection", "Keep-Alive"); // 维持长链接
             conn.setRequestProperty("Charset", "UTF-8");
             conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA
                     + "; boundary=" + HTTP_BOUNDARY);

            StringBuilder formItemData = new StringBuilder();
             // 构建 表单字段内容
           for (Map.Entry<String, String> entry : params.entrySet()) {
                 formItemData.append("--");
                 formItemData.append(HTTP_BOUNDARY);
                 formItemData.append(LINE_ENTER);
                formItemData.append("Content-Disposition: form-data; name=\""
                       + entry.getKey() + "\"\r\n\r\n");
                 formItemData.append(entry.getValue());
                 formItemData.append(LINE_ENTER);
            }
             DataOutputStream outStream = new DataOutputStream(
                   conn.getOutputStream());
            // 发送表单字段内容到服务器
             outStream.write(formItemData.toString().getBytes());
 
             // 发送上传文件数据
           for (FormFile fileData : formFiles) {
                 StringBuilder fileSplit = new StringBuilder();
                 fileSplit.append("--");
                 fileSplit.append(HTTP_BOUNDARY);
                 fileSplit.append(LINE_ENTER);
                fileSplit.append("Content-Disposition: form-data;name=\""
                        + fileData.getFormname() + "\";filename=\""
                        + fileData.getFilename() + "\"\r\n");
                fileSplit.append("Content-Type:" + fileData.getContentType()
                         + LINE_ENTER + LINE_ENTER);
                 outStream.write(fileSplit.toString().getBytes());

                 if (fileData.getInStream() != null) {
                     byte[] buffer = new byte[1024];
                     int length = 0;
                     while ((length = fileData.getInStream().read()) != -1) {
                        outStream.write(buffer, 0, length);
                     }
                    fileData.getInStream().close();
               } else {
                     outStream.write(fileData.getData(), 0,
                             fileData.getData().length);
                 }
                 outStream.write(LINE_ENTER.getBytes());
             }
             // 数据结束标志
            byte[] endData = ("--" + HTTP_BOUNDARY + "--" + LINE_ENTER)
                     .getBytes();
            outStream.write(endData);
             outStream.flush();
             outStream.close();
            int responseCode = conn.getResponseCode();
             if (responseCode != RESPONSE_OK) {
               throw new RuntimeException("请求url失败");
             }
             InputStream is = conn.getInputStream();
             int ch;
             StringBuilder b = new StringBuilder();
            while ((ch = is.read()) != -1) {
                 b.append((char) ch);
           }
            Log.i("HttpPost", b.toString());
             conn.disconnect();
             return b.toString();
        } catch (Exception e) {
            throw new RuntimeException();
       }
     }
 
   // 上传单个文件
   public static String post(String urlPath, Map<String, String> params,
             FormFile formFiles) {
         return post(urlPath, params, new FormFile[] { formFiles });
     }
}

 

 // 以表单方式发送请求
 
         public static void sendDataToServerByForm() throws Exception {
 
                     Map<String, String> params = new HashMap<String, String>();
 
                 params.put("method", "sendDataByForm");

                   params.put("strData", "字符串数据");
 
                    // 获取SDCard中的good.jpg
 
                    File file = new File(Environment.getExternalStorageDirectory(),

                                      "app_Goog_Android_w.png");
 
                    FormFile fileData = new FormFile("app_Goog_Android_w.png", new FileInputStream(file),

                                    "fileData", "application/octet-stream");
 
                   HttpUploadRequester.post(

                                     "http://192.168.0.2:8080/AndroidWebServer/server.do", params,

                                      fileData);

          }
 
分享到:
评论

相关推荐

    java httpclient https或http及文件中转上传工具类

    该工具类使用httpclient进行http or https请求,包括requestbody格式和form表单格式,另外含文件服务器中转上传方法,几乎支持所有常用接口调用,内含详细注释和说明文件,含jar包,及maven方式引用,拿过去直接用吧

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    doGet、doPost、模拟post上传文件等http请求util

    模拟http请求实现文件上传,模拟doGet、doPost请求,实现信息发送

    javaweb项目常用工具包

    Base64工具类-字符编码工具类-数据类型转换-日期工具类-Escape中文转码工具类-fastjson工具类-文件工具类-Http工具类-http请求工具类-用于模拟HTTP请求中GET/POST方式 -图片处理工具类-Ip工具类-mail工具类-Map工具...

    上传文件工具类

    java上传文件工具类 很全面

    okhttp3.0二次封装(独立的3个java文件封装的)

    支持get请求,post请求,支持文件上传和下载。 使用方法: 代码很简单,只有三个Java文件,建议下载后将Java文件拷贝到工程中使用。 封装的功能有: 一般的get请求 一般的post请求 一般的put请求 一般的...

    JAVA程序开发大全---上半部分

    本书系统全面地介绍了Java中的各项主流技术,以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、...

    http请求测试工具,可以上传文件

    用来测试rest的一个工具类,我觉得比较好的是可以发送文件

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    基于JavaFX构建简易Http请求工具(Java)

    一个基于JavaFX图形框架构建的简易Http请求工具,目前实现了GET, POST, PUT, DELETE四种Http请求方式 ...GET, DELETE请求不支持发送请求体以及上传文件 历史记录信息存储在~/PostJFX/logs/log.db中

    word源码java-javaUtils-:java常用的工具类,附带Springboot配置属性目录

    工作中实用的Java工具类整理 config 多数据源的配置及动态切换数据库的切面配置(还未完善好,配置文件暂上传) database JedisUtil(redis连接操作实现) encrypt RsaUtils(rsa加密Java实现) http http.async ...

    java开源包1

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    安卓java读取网页源码-android-blocked-upload:安卓大文件/多文件断点续传示例工具,核心使用RandomAccessF

    初始化一个指定大小的文件,在指定位置写入此二进制区块数据,即完成大文件上传任务了 此app依赖了 RxJava 、FastJson、OkHttp 三个外部工具库 RxJava 启动一个线程作为定时器,每秒(使用时可以自定义频率)执行一...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java开源包10

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    全书一共被压缩为5个rar,这是第二个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何...

    common-utils:Java常用工具类: 包含csv文件操作,excel表POI操作,文件上传,压缩,邮件发送,HTTP请求,XML解析,json操作,密码验证等

    common-utils Java常用工具类: 包含csv文件操作,excel表POI操作,文件上传,压缩,邮件发送,HTTP请求,XML解析,json操作,密码验证等

    play框架手册

    用play.db.jpa.Blob存储上传文件 - 74 - 强制保存 - 75 - 更多公共类型generic typing问题 - 77 - 08.Play.libs库包 - 78 - 用XPath解析XML - 78 - Web Service client - 79 - Functional programming with Java功能...

    java源码包4

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

Global site tag (gtag.js) - Google Analytics