`

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-ipfs-http-client-master_ipfs_java-ipfs_java_

    在`java-ipfs-http-client-master`压缩包中,包含了这个库的源代码,你可以深入了解其实现细节,包括如何处理HTTP请求、解析响应以及如何封装IPFS的API调用。通过阅读源码,开发者可以学习如何构建与IPFS网络的交互...

    java模拟发送form-data的请求方式

    Form-Data 是一种常见的 HTTP 请求体格式,广泛应用于文件上传、表单提交等场景。下面是 Java 模拟发送 Form-Data 的请求方式的详细介绍。 什么是 Form-Data Form-Data 是一种 MIME 类型,用于描述表单数据的格式...

    java文件上传--fileupload

    `FileUploadServlet.java`是处理文件上传请求的Servlet,它需要实现`doPost`方法,该方法会接收到包含上传文件的HTTP请求。在这个方法里,我们需要创建一个`ServletFileUpload`实例,它是`CommonsFileUpload`提供的...

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

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

    java上传文件jar

    总之,Apache Commons IO和Apache Commons FileUpload是Java开发中处理文件上传不可或缺的工具。它们提供了丰富的功能,帮助开发者安全、高效地完成文件上传操作,同时也大大减少了处理文件上传时可能出现的问题。在...

    google-http-java-client-1.13.1-beta.zip

    4. "proguard-google-http-client.txt":ProGuard是一个Java代码混淆器、优化器和裁剪器,此文件可能包含针对Google HTTP Java客户端的特定ProGuard配置,用于优化和保护发布时的代码。 5. "dependencies":可能是一...

    Java 上传文件到 SharePoint

    在实际开发中,你还需要考虑错误处理和异常捕获,确保在文件上传过程中遇到问题时能够妥善处理。此外,如果SharePoint的访问控制较为严格,可能需要使用ADAL(Active Directory Authentication Library)来获取访问...

    WHUT-java多线程实验-第三周-文件上传和下载.zip

    在IDEA中,你可以使用Maven或Gradle构建项目,导入必要的依赖,例如Spring MVC或Jersey来处理HTTP请求,实现文件上传和下载的Controller。同时,IDEA的调试和测试功能可以帮助你快速定位和修复代码中的问题。 总的...

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

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

    fastdfs-client-java-1.29-SNAPSHOT.jar

    在Java环境中,`fastdfs-client-java`是用于连接FastDFS服务器的客户端库,使得Java应用能够方便地进行文件上传、下载等操作。本文将详细探讨`fastdfs-client-java-1.29-SNAPSHOT.jar`这一核心组件,以及与其相关的`...

    java文件上传下载工具类

    以下是对"java文件上传下载工具类"这一主题的详细解释。 首先,让我们了解文件上传。在Web应用中,用户可能需要上传文件,如图片、文档或视频。Java通过Servlet API提供了处理文件上传的功能。Servlet 3.0及以上...

    java-多文件上传dome

    在Java中,处理多文件上传通常涉及到Servlet API,特别是`Part`接口,它是Java EE 7引入的一个用于处理HTTP请求中的多媒体内容部分的接口。`Part`接口允许我们读取上传文件的内容,包括文件名、大小以及内容本身。...

    fastdfs-client-java-1.27.zip

    2. **负载均衡**:通过Tracker服务器对Storage服务器进行动态负载均衡,使得文件上传和下载的请求能够均匀分布到各个节点,减少单个服务器的压力。 3. **文件冗余备份**:支持文件的冗余备份,提供高可用性,保证...

    java-ipfs-http-api-master 解决405错误 文件上传下载

    在这个项目中,"解决405错误"指的是在使用Java IPFS HTTP API进行文件上传或下载时遇到的方法不允许(Method Not Allowed)的HTTP错误。405错误通常发生在客户端尝试使用服务器不支持的HTTP请求方法,例如,可能尝试...

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

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

    上传文件工具类

    总结来说,"上传文件工具类"是Java应用程序中用于处理文件上传的核心组件,涉及到网络通信、文件操作、异常处理、安全控制等多个核心编程概念。理解和掌握这些知识点对于任何Java开发者来说都是至关重要的。

    fastdfs-client-java-1.27-SNAPSHOT.zip

    3. **文件上传**:通过客户端API将本地文件上传至FastDFS系统,上传过程中,FastDFS会自动进行负载均衡和文件复制,确保高可用性。 4. **文件下载**:根据文件的存储路径,从FastDFS系统中下载文件到本地。 5. **...

    java文件异步上传

    当文件上传请求到达服务器时,这些方法会接收文件流,保存到服务器的磁盘上,或者将其存储到数据库或云存储服务中。处理上传的Java代码需要考虑到文件大小限制、错误处理、文件命名规则以及安全性等方面的问题。 ...

    aip-java-sdk-4.1.0.zip )

    2. **上传图片**:调用`AipOcr.imageBase64()`或`AipOcr.imageUrl()`方法,将本地图片文件转化为Base64编码或提供图片URL,作为识别请求的数据源。 3. **选择识别模式**:根据需求选择合适的OCR接口,如`AipOcr....

    java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载

    而Apache Commons FileUpload则专门用于处理HTTP请求中的多部分数据,即文件上传。 二、Servlet基础知识 Servlet是Java平台上的一个服务器端组件,用于扩展Web服务器的功能。在文件上传和下载场景中,Servlet接收...

Global site tag (gtag.js) - Google Analytics