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

yizhihongxing

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

相关文章

  • java编译器和JVM的区别

    Java编译器和JVM(Java虚拟机)是Java语言的两个核心组成部分,它们分别承担着Java程序的编译和执行任务。下面将详细讲解它们的区别: Java编译器 Java编译器是负责把Java源代码(.java)编译成Java字节码(.class)的工具。在Java的编译过程中,Java编译器会将源代码解析成对应的抽象语法树,然后将抽象语法树翻译成字节码,最…

    Java 2023年5月26日
    00
  • 将15位身份证补全为18位身份证的算法示例详解

    关于“将15位身份证补全为18位身份证的算法示例详解”的完整攻略,我可以提供以下内容: 问题背景 在进行一些需要身份证号码验证的操作时,我们有时会遇到15位的身份证号码无法通过验证的情况。这是因为目前国家规定的身份证号码都为18位。因此,如果我们需要将15位的身份证号码转换为18位的身份证号码,就需要进行一些补全操作。下面是一个示例。 算法详解 将15位身份…

    Java 2023年5月19日
    00
  • Spring中@Transactional用法详细介绍

    我来为您详细讲解Spring中@Transactional用法的攻略。 Spring中@Transactional用法详细介绍 一、什么是@Transactional @EnableTransactionManagement注解:开启事务管理器。 @Transactional注解:在类或方法上标记该业务需要事务管理。 二、@Transactional的常用属…

    Java 2023年5月20日
    00
  • 如何把JAR发布到maven中央仓库的几种方法

    下面是如何将JAR包发布到Maven中央仓库的几种方法的完整攻略: 方法一:使用Maven发布插件 首先,在你的项目中加入Maven发布插件: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <art…

    Java 2023年5月20日
    00
  • struts2 中文乱码的解决办法分享

    下面我将详细讲解如何解决 Struts2 中文乱码问题。 问题描述 在 Struts2 应用程序中,当提交的表单数据中包含中文字符时,服务器端收到的请求参数中文会出现乱码,给用户带来了不好的使用体验。 解决思路 解决 Struts2 中文乱码问题,可以通过以下两种方式实现: 在 web.xml 文件中配置 Filter,拦截所有请求,对请求参数进行编码。 在…

    Java 2023年5月20日
    00
  • Spring实战之缓存使用condition操作示例

    让我来为您详细讲解“Spring实战之缓存使用condition操作示例”的完整攻略。 1. 背景介绍 Spring Cache是Spring框架的一项优秀功能,它能够优化应用程序的性能和响应时间。通过使用Spring Cache,您可以将方法结果缓存在内存中,并在需要时直接从内存中获取缓存结果,从而避免了在每次调用方法时执行相同的计算。 2. 基本原理 S…

    Java 2023年5月19日
    00
  • java 非对称加密算法DH实现详解

    Java 非对称加密算法 DH 实现详解 什么是 DH 算法 DH(Diffie-Hellman)算法是一种基于数学问题的密钥交换协议,旨在让通信双方在不将真正的密钥送出的情况下,各自生成具有相同密钥的方法。DH 算法主要用于加密通信和加密存储,其最大的优点在于,即使密文被截获,攻击者也无法破解密文,从而保证通信安全性。 DH 算法详解 密钥交换流程 DH …

    Java 2023年5月19日
    00
  • 详解基于mpvue微信小程序下载远程图片到本地解决思路

    接下来我将详细讲解如何基于mpvue微信小程序下载远程图片到本地解决思路。 1. 问题背景 在使用mpvue开发微信小程序的过程中,我们经常会遇到下载远程图片到本地的需求。但mpvue的模板语法中并没有提供类似Vue.js的v-html指令,因此出现了不能直接将远程图片显示在页面上的情况。 2. 解决思路 mpvue提供的解决思路是通过wx.download…

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