Java 发送http请求上传文件功能实例

以下是Java发送HTTP请求上传文件的完整攻略,包含示例代码、步骤以及解释。

1. 前置准备

在进行Java发送HTTP请求上传文件之前,我们需要先做一些前置准备,具体如下:

  • 下载安装Java开发环境。
  • 学习Java基础知识,如I/O流、网络编程等。
  • 学习使用Java HttpURLConnection类发送HTTP请求。

2. 发送HTTP请求上传文件的步骤

具体的,通过以下步骤来实现Java发送HTTP请求上传文件功能:

2.1 构建URL对象

首先,我们需要使用如下代码构建一个URL对象,用于指定上传文件的接收URL地址:

URL url = new URL("http://example.com/upload");

2.2 打开连接

接着,我们可以使用如下代码打开一个HTTP连接:

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

2.3 设置连接属性

在开始上传文件之前,我们需要设置一些连接属性,包括请求方法、文件类型、文件大小等,具体如下:

conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
conn.setDoOutput(true);

其中,"POST"表示使用POST方式上传文件,"Content-Type"属性表示文件类型为"multipart/form-data","boundary"则表示上传文件的分隔符。

同时,由于我们需要向服务器发送文件数据,所以需要将"doOutput"属性设置为true。

2.4 构建multipart/form-data数据

在设置连接属性之后,我们需要根据上传文件的格式构建multipart/form-data格式的数据。具体构建方法如下:

DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes("--" + boundary + "\r\n");
dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"\r\n");
dos.writeBytes("Content-Type: application/octet-stream\r\n\r\n");

其中,boundary就是之前设置的分隔符,file.getName()表示获取上传文件的文件名,"Content-Type"表示文件类型为"application/octet-stream"。

2.5 读取文件数据

在构建数据之后,我们需要将文件的二进制数据读取到DataOutputStream流中:

FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
    dos.write(buffer, 0, len);
}

其中,file是上传文件的File对象,fis用于读取文件数据到内存缓冲区中。

2.6 结束multipart/form-data数据

数据读取完成后,我们需要通过向DataOutputStream流中写入结尾标识符来结束multipart/form-data数据的构建:

dos.writeBytes("\r\n--" + boundary + "--\r\n");
dos.flush();

2.7 获取响应数据

最后,我们可以通过以下代码获取服务器返回的响应数据:

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

其中,"getInputStream"方法用于获取服务器响应的输入流,"BufferedReader"用于读取输入流中的字符串数据并输出到控制台中。

3. 示例代码

下面是两个示例代码,用于演示如何使用Java发送HTTP请求上传文件。

示例1:上传单个文件

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUploadFileDemo {

    public static void main(String[] args) throws IOException {
        File file = new File("图片.jpg");

        String boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
        URL url = new URL("http://example.com/upload");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
        conn.setDoOutput(true);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
        dos.writeBytes("--" + boundary + "\r\n");
        dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"\r\n");
        dos.writeBytes("Content-Type: application/octet-stream\r\n\r\n");

        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = fis.read(buffer)) != -1) {
            dos.write(buffer, 0, len);
        }

        dos.writeBytes("\r\n--" + boundary + "--\r\n");
        dos.flush();

        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        fis.close();
        dos.close();
        br.close();
    }
}

示例2:上传多个文件

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUploadFilesDemo {

    public static void main(String[] args) throws IOException {
        File file1 = new File("文件1.txt");
        File file2 = new File("文件2.txt");
        File file3 = new File("文件3.txt");

        String boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
        URL url = new URL("http://example.com/upload");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
        conn.setDoOutput(true);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

        // 上传文件1
        dos.writeBytes("--" + boundary + "\r\n");
        dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file1.getName() + "\"\r\n");
        dos.writeBytes("Content-Type: application/octet-stream\r\n\r\n");

        FileInputStream fis1 = new FileInputStream(file1);
        byte[] buffer1 = new byte[1024];
        int len1 = -1;
        while ((len1 = fis1.read(buffer1)) != -1) {
            dos.write(buffer1, 0, len1);
        }

        // 上传文件2
        dos.writeBytes("\r\n--" + boundary + "\r\n");
        dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file2.getName() + "\"\r\n");
        dos.writeBytes("Content-Type: application/octet-stream\r\n\r\n");

        FileInputStream fis2 = new FileInputStream(file2);
        byte[] buffer2 = new byte[1024];
        int len2 = -1;
        while ((len2 = fis2.read(buffer2)) != -1) {
            dos.write(buffer2, 0, len2);
        }

        // 上传文件3
        dos.writeBytes("\r\n--" + boundary + "\r\n");
        dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file3.getName() + "\"\r\n");
        dos.writeBytes("Content-Type: application/octet-stream\r\n\r\n");

        FileInputStream fis3 = new FileInputStream(file3);
        byte[] buffer3 = new byte[1024];
        int len3 = -1;
        while ((len3 = fis3.read(buffer3)) != -1) {
            dos.write(buffer3, 0, len3);
        }

        dos.writeBytes("\r\n--" + boundary + "--\r\n");
        dos.flush();

        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        fis1.close();
        fis2.close();
        fis3.close();
        dos.close();
        br.close();
    }
}

以上就是Java发送HTTP请求上传文件的完整攻略,希望能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 发送http请求上传文件功能实例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • springmvc之获取参数的方法(必看)

    SpringMVC之获取参数的方法(必看)的完整攻略 在SpringMVC中,获取请求参数是非常常见的操作。本文将介绍SpringMVC中获取参数的几种方法,并提供两个示例说明。 方法一:使用@RequestParam注解 使用@RequestParam注解可以获取请求参数。在Controller方法中,我们可以使用@RequestParam注解来指定参数名…

    Java 2023年5月17日
    00
  • SpringBoot 整合mybatis+mybatis-plus的详细步骤

    下面是 “SpringBoot整合MyBatis和MyBatis-Plus的详细步骤”。 1. 添加依赖 首先,在 pom.xml 中添加以下依赖: <!– SpringBoot 整合 MyBatis 依赖 –> <dependency> <groupId>org.mybatis.spring.boot</gro…

    Java 2023年5月20日
    00
  • 详解SpringBoot整合MyBatis详细教程

    详解SpringBoot整合MyBatis详细教程 前言 SpringBoot和MyBatis都是Java开发领域中非常流行的技术,它们分别解决了Web应用和数据访问两个方面的问题。在实际的开发中,我们通常需要将它们整合在一起,形成一个强大的系统。本文将详细讲解如何将SpringBoot和MyBatis整合在一起。 环境准备 在开始整合之前,我们需要准备以下…

    Java 2023年5月15日
    00
  • Java垃圾回收之标记压缩算法详解

    Java垃圾回收之标记压缩算法详解 什么是标记压缩算法 标记压缩算法(Mark-Compact Algorithm)是一种垃圾回收算法,它与标记清除算法和复制算法并称为三大经典垃圾回收算法之一。它是针对标记清除算法可能产生的内存碎片问题而提出的。 标记压缩算法分为两个步骤:标记活动对象和压缩内存。在标记活动对象阶段,标记所有存活对象,并将其从不可达对象中区分…

    Java 2023年5月19日
    00
  • Java建造者模式构建复杂对象的最佳实践

    Java建造者模式是一种创建型设计模式,通过一步一步的构建复杂对象来实现构建者模式。 下面是Java建造者模式构建复杂对象的完整攻略: 步骤一:创建一个产品类 创建一个产品类,该类由多个属性组成,并提供setter和getter方法。 public class Computer { private String cpu; private String mem…

    Java 2023年5月26日
    00
  • 创业如何选择WEB开发语言

    如果正在考虑创业,需要选择合适的 WEB 开发语言进行开发。但是,在如此众多的编程语言中选择一种可能会变得很困难,因为每种语言都有其独特的优势和弱点。下面是一些有用的提示,以帮助您选择正确的Web开发语言来开启成功的创业之旅。 第1步:确定项目需求 在开始选择编程语言之前,首先需要明确定义项目的需求。例如,您的应用程序是仅需要使用基本UI控件还是需要更高级的…

    Java 2023年6月16日
    00
  • 常见的Atomic类有哪些?

    当我们使用多线程编程时,为了保证多线程程序的正确性和同步性,我们很常使用 Atomic 类型来进行操作。Atomic 类可以保证某个操作的原子性,避免数据竞争等问题。在Java中,Java.util.concurrent.atomic 包下提供了一些常见的 Atomic 类。接下来,我将会具体讲解这些 Atomic 类的使用方法和注意事项。 AtomicIn…

    Java 2023年5月11日
    00
  • Java8新特性时间日期库DateTime API及示例详解

    Java8新特性时间日期库DateTime API及示例详解 什么是DateTime API? DateTime API是Java 8引入的一个新功能,它提供了一组全新的日期和时间API,使得开发人员能够更轻松地操作日期和时间。同时,它还提供了处理时区、日历、持续时间等功能。 如何使用DateTime API? DateTime API包含在Java 8的j…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部