详解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日

相关文章

  • Redis有效时间设置以及时间过期处理操作

    以下是 Redis 有效时间设置以及时间过期处理操作的完整攻略: Redis 有效时间设置 在 Redis 中,我们可以通过设置键值对的有效时间来控制数据的过期时间。具体可以使用 EXPIRE key seconds 命令来设置某个键对应的有效时间,其中 key 表示键名,seconds 表示有效期时间(单位为秒)。 例如,我们可以设置一个名为 mykey …

    Java 2023年5月20日
    00
  • 使用Docker部署Spring Boot的方法示例

    请先阅读以下关于“使用Docker部署Spring Boot的方法示例”的完整攻略: 1. 准备工作 要使用Docker来部署你的Spring Boot应用程序,你需要以下几个组件: Docker Engine Docker Compose Spring Boot应用程序的可执行jar文件 Dockerfile 安装Docker Engine 最新版本的Do…

    Java 2023年5月20日
    00
  • jsp cookie+session实现简易自动登录

    当用户登录后,在一定时间内不需要再进行登录操作,而是直接跳转到主页,这种操作是自动登录。实现自动登录涉及到在浏览器端保存用户的登录信息,并在下一次访问时使用该信息验证用户身份。在Java Web开发中,可以使用JSP会话(session)和cookie实现简易自动登录。 实现自动登录的思路 自动登录的实现思路可以分为以下几个步骤: 用户使用正确的用户名和密码…

    Java 2023年6月15日
    00
  • Sprint Boot @TransactionalEventListener使用方法详解

    在Spring Boot中,@TransactionalEventListener注解用于在事务提交后异步地处理事件。使用@TransactionalEventListener注解可以确保事件处理程序在事务提交后才会执行,从而避免了在事务未提交时处理事件可能导致的问题。本文将详细介绍@TransactionalEventListener注解的作用和使用方法,…

    Java 2023年5月5日
    00
  • Java实现学生信息管理系统(使用数据库)

    下面我来详细讲解Java实现学生信息管理系统使用数据库的完整攻略。 思路 实现学生信息管理系统需要考虑以下几个方面: 数据库的设计和建立 Java程序连接数据库 Java程序操作数据库 前端页面的设计和制作 将Java程序和前端页面结合在一起 在这里我们选择使用MYSQL数据库进行操作,使用JDBC连接数据库,采用MVC设计模式来实现程序。 实现步骤 1. …

    Java 2023年5月19日
    00
  • 实现Servlet程序的三种方法(小结)

    当我们需要创建JavaWeb应用程序的时候,Servlet是不可或缺的一部分。下面讲解一下如何实现Servlet程序的三种方法。 方法一:继承javax.servlet.http.HttpServlet 这是最常用的方式,创建一个继承于javax.servlet.http.HttpServlet的类,然后重写其中的doGet()、doPost()等方法,然后…

    Java 2023年5月19日
    00
  • Java之Pattern.compile函数用法详解

    Java之Pattern.compile函数用法详解 什么是Pattern.compile函数 Pattern.compile是Java正则表达式中的一个方法,可以用来编译正则表达式并生成一个Pattern对象。该对象可以被用于创建Matcher对象,以执行匹配操作。 Pattern.compile函数的语法 下面是Pattern.compile函数的语法:…

    Java 2023年5月26日
    00
  • 了解java Struts拦截器的相关操作

    了解Java Struts框架和拦截器是非常重要的,因为它们可以帮助提高代码的可重用性和维护性。下面是了解Java Struts拦截器的相关操作的完整攻略。 什么是Java Struts拦截器 拦截器是Java Struts框架中的一个重要组成部分,它允许我们在请求到达目标Action之前或之后跟踪/处理请求和响应。具体地说,它们是一种处理请求和响应的机制,…

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