详解Java向服务端发送文件的方法

详解Java向服务端发送文件的方法

在Java编程中,我们经常需要向服务端发送文件,比如我们需要上传用户的头像、简历等等。本文将详细讲解Java向服务端发送文件的方法。

1. 使用Java中的URLConnection发送文件

Java中的URLConnection类可以用来向服务端发送文件。下面是示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class SendFileExample1 {
    public static void main(String[] args) throws Exception {
        // 需要上传的文件
        File file = new File("test.txt");
        // 上传的地址
        URL url = new URL("http://localhost:8080/upload");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Charset", "UTF-8");
        String boundary = "---------------------------" + System.currentTimeMillis();
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        OutputStream out = conn.getOutputStream();
        // 文件参数
        StringBuilder sb1 = new StringBuilder();
        sb1.append("--");
        sb1.append(boundary);
        sb1.append("\r\n");
        sb1.append("Content-Disposition: form-data;name=\"file\"; filename=\"" + file.getName() + "\"\r\n");
        sb1.append("Content-Type: application/octet-stream\r\n\r\n");
        out.write(sb1.toString().getBytes());
        // 文件内容
        FileInputStream in = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        in.close();
        // 结束符
        StringBuilder sb2 = new StringBuilder();
        sb2.append("\r\n");
        sb2.append("--");
        sb2.append(boundary);
        sb2.append("--\r\n");
        out.write(sb2.toString().getBytes());
        out.flush();
        // 读取响应
        System.out.println(conn.getResponseCode());
        out.close();
        conn.disconnect();
    }
}

在这个例子中,我们首先创建了一个File对象,表示需要上传的文件。然后,我们创建了一个URL的对象,表示上传的地址。我们打开了一个URLConnection连接,并使用下面这些方法进行了一些设置:

  • setRequestMethod("POST"):表示这个请求是一个POST请求。
  • setDoOutput(true):表示允许向服务端写入数据。
  • setDoInput(true):表示允许从服务端读取返回的数据。
  • setUseCaches(false):禁用缓存。
  • setRequestProperty("Connection", "Keep-Alive"):设置连接属性,保持连接。
  • setRequestProperty("Charset", "UTF-8"):设置字符集。
  • setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary):设置请求类型为multipart/form-data,后面是一个随机生成的boundary字符串。

接下来,我们获取OutputStream对象,并使用StringBuilder对象拼接请求参数。首先是文件参数,然后是文件内容,最后是结束符。我们读取文件内容,使用OutputStream对象写入到服务端。

最后,我们获取连接的响应码,关闭OutputStream,并断开连接。

2. 使用Apache HttpClient发送文件

Apache HttpClient是一个强大的Http客户端,它可以用来发送和接收Http请求和响应。下面是示例代码:

import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class SendFileExample2 {
    public static void main(String[] args) throws Exception {
        // 需要上传的文件
        File file = new File("test.txt");
        // 上传的地址
        String url = "http://localhost:8080/upload";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            HttpPost uploadFile = new HttpPost(url);
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.addBinaryBody("file", file, ContentType.APPLICATION_OCTET_STREAM, file.getName());
            HttpEntity multipart = builder.build();
            uploadFile.setEntity(multipart);
            CloseableHttpResponse response = httpClient.execute(uploadFile);
            System.out.println(response.getStatusLine().getStatusCode());
            response.close();
        } finally {
            httpClient.close();
        }
    }
}

在这个例子中,我们首先创建了一个File对象,表示需要上传的文件。然后,我们创建了一个HttpClient对象,并使用下面这些方法进行了一些设置:

  • HttpClients.createDefault():创建一个默认的HttpClient客户端。

接下来,我们创建了一个HttpPost对象,并使用MultipartEntityBuilder对象构建了请求参数。我们将文件添加为二进制数据,并设置Content-Type为application/octet-stream。最后,我们将请求参数设置到HttpPost对象中。

最后,我们执行HttpPost请求并获取响应,输出响应码。

总结

上述两种方法都可以用来向服务端发送文件,使用起来都非常方便。读者可以根据自己的实际情况选择其中一种方法。在使用的过程中,需要注意的一点是文件大小不宜过大,否则会占用过多的服务器资源,影响服务器性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java向服务端发送文件的方法 - Python技术站

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

相关文章

  • spring security在分布式项目下的配置方法(案例详解)

    下面为大家详细讲解Spring Security在分布式项目下的配置方法。 1、什么是Spring Security Spring Security 是一个基于 Spring 为后台应用程序提供认证和授权的框架,支持常见的认证和授权技术,并且易于扩展。它能够保护 Web 应用程序及其服务,提供认证和授权相关的附加功能,如密码编码、Single Sign On…

    Java 2023年5月20日
    00
  • Spring Data Jpa 自动生成表结构的方法示例

    首先,我们需要先了解Spring Data Jpa自动生成表结构的方法。Spring Data Jpa是Spring框架中的一个重要组成部分,它提供了一种方便快捷的方式来管理和操作数据库中的数据。 Spring Data Jpa可以自动生成表结构,这样就不需要手动编写SQL语句来创建表了。具体的步骤如下: 配置数据源 在你的Spring应用程序中,你需要首先…

    Java 2023年5月20日
    00
  • Java使用线程池执行定时任务

    使用线程池执行定时任务是提高 Java 程序性能的重要手段之一。下面就来详细讲解 Java 使用线程池执行定时任务的完整攻略。 1. 什么是线程池? 线程池是一种线程管理机制,它主要解决两个问题:线程复用和线程管理。线程池中维护了一组已经创建好的线程,供我们执行任务,这样就避免了每次执行任务都需要创建和销毁线程的开销。 2. Java 如何使用线程池执行定时…

    Java 2023年5月19日
    00
  • SpringBoot+SpringSecurity+jwt实现验证

    下面我会提供一个基于Spring Boot、Spring Security 和 JSON Web Token(JWT)的认证示例。 一、什么是JWT JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种简单的、自包含的方式,用于在通过网络进行传输的两个实体之间安全传递信息。它被称为自包含是因为JWT包含了所有身份验证(Aut…

    Java 2023年5月20日
    00
  • springboot整合redis修改分区的操作流程

    下面是关于“springboot整合redis修改分区的操作流程”的完整攻略: 操作流程 修改redis.conf文件 在redis.conf配置文件中搜索”hash-max-ziplist-entries”和“hash-max-ziplist-value”两个参数。这两个参数决定了Redis使用ziplist存储hash类型的数据结构时,ziplist中的…

    Java 2023年5月20日
    00
  • java字符串的截取方法substring()代码解析

    标题:Java字符串的截取方法substring()代码解析 介绍:Java中的字符串截取方法substring()是常用的字符串操作方法之一。本文将对该方法进行详细解析,包括方法的使用说明、参数含义、返回值类型等,并通过示例说明其使用方法和注意事项。 方法使用说明 substring()是Java中用于截取字符串的方法,其基本语法如下: public St…

    Java 2023年5月26日
    00
  • java自己手动控制kafka的offset操作

    当使用kafka作为消费者时,消费者往往需要对消费的offset进行管理,以确保以后能够正确地读取数据。我们通常使用kafka内置的自动提交offset机制,但有时候我们也需要手动控制offset。 下面是一些步骤和示例,让你更好地了解如何手动控制kafka的offset操作: 步骤1:创建kafka消费者 首先,我们需要创建kafka消费者。以下是创建一个…

    Java 2023年5月20日
    00
  • SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

    3)OAuth2 Client 结合GitHub授权案例 本随笔说明:这仅作为OAuth2 Client初次使用的案例,所以写得很简单,有许多的不足之处。 OAuth2 Client(OAuth2客户端)是指使用OAuth2协议与授权服务器进行通信并获取访问令牌的应用程序或服务。OAuth2客户端代表最终用户(资源拥有者)向授权服务器请求授权,并使用授权后的…

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