Java上传文件到服务器端的方法

关于Java上传文件到服务器端的方法,主要有以下两种方式:

方式一:使用原生java.net.URLConnection API上传文件

==Step 1:== 前端HTML代码中,增加文件上传控件(input type="file")

<form method="post" action="http://localhost:8080/uploadFile" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="上传文件"/>
</form>

==Step 2:== 服务端Java代码中,使用URLConnection类实现文件上传

@PostMapping("/uploadFile")
@ResponseBody
public String uploadFile(HttpServletRequest request) throws IOException {
    // 获取文件
    MultipartFile file = ((MultipartHttpServletRequest) request).getFile("file");
    String fileName = file.getOriginalFilename();
    // 创建URL对象
    URL url = new URL("http://localhost:8080/uploadFile");
    // 创建连接
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    // 设置请求方法为POST
    connection.setRequestMethod("POST");

    // 设置请求头
    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + "FILE_BOUNDARY");

    // 开启写入模式
    connection.setDoOutput(true);
    connection.setDoInput(true);

    // 获取输出流
    OutputStream outputStream = connection.getOutputStream();
    PrintWriter writer = new PrintWriter(outputStream);
    // 构造文件写入请求体
    writer.append("--" + "FILE_BOUNDARY" + "\r\n");
    writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n");
    writer.append("Content-Type: application/octet-stream\r\n\r\n");
    writer.flush();

    // 写入文件
    FileInputStream fis = (FileInputStream) file.getInputStream();
    byte[] buffer = new byte[4096];
    int length;
    while ((length = fis.read(buffer)) > 0) {
        outputStream.write(buffer, 0, length);
    }
    outputStream.flush();
    fis.close();

    // 完成请求体
    writer.append("\r\n--" + "FILE_BOUNDARY" + "--\r\n");
    writer.flush();

    // 获取服务器响应
    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String line;
    StringBuilder stringBuilder = new StringBuilder();
    while ((line = reader.readLine()) != null) {
        stringBuilder.append(line).append("\n");
    }
    reader.close();
    connection.disconnect();
    return stringBuilder.toString();
}

方式二:使用Apache HttpClient库上传文件

==Step 1:== Maven依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.10</version>
</dependency>

==Step 2:== 服务端Java代码中,使用HttpClient类实现文件上传

@PostMapping("/uploadFile")
@ResponseBody
public String uploadFile(HttpServletRequest request) throws IOException {
    // 获取文件
    MultipartFile file = ((MultipartHttpServletRequest) request).getFile("file");
    String fileName = file.getOriginalFilename();

    // 创建HttpClient对象
    CloseableHttpClient httpClient = HttpClients.createDefault();
    // 创建HttpPost对象
    HttpPost httpPost = new HttpPost("http://localhost:8080/uploadFile");
    // 创建文件体
    HttpEntity httpEntity = MultipartEntityBuilder.create()
            .addBinaryBody("file", file.getInputStream(), ContentType.DEFAULT_BINARY, fileName)
            .build();
    // 设置请求体
    httpPost.setEntity(httpEntity);
    // 发送请求并获取响应
    CloseableHttpResponse response = httpClient.execute(httpPost);
    // 读取响应内容
    InputStream inputStream = response.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        stringBuilder.append(line).append("\n");
    }
    reader.close();
    inputStream.close();
    httpClient.close();
    response.close();
    return stringBuilder.toString();
}

以上就是Java上传文件到服务器端的两种方法,可以根据需求选择使用其中一种。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java上传文件到服务器端的方法 - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • 自定义类加载器的实现原理是什么?

    当JVM加载一个类的字节码文件时,会使用默认的双亲委派模型来进行加载。也就是说,首先会询问父类加载器是否已经加载过该类,如果没有,父类加载器会继续向上委派该请求。当所有父类加载器都无法加载该类时,系统默认的类加载器会使用自己的方式进行类加载。但是在某些特殊的情况下,我们需要对类的加载方式进行自定义,这就需要使用自定义类加载器。 自定义类加载器的实现原理是:继…

    Java 2023年5月10日
    00
  • Java基础之Bean的创建、定位和使用

    Java基础之Bean的创建、定位和使用 在Java开发中,Bean是非常常用的一种Java类。Bean是一种被特殊编写的Java类,通常用于封装和传输数据,它拥有以下几个特点: 具有无参构造器 具有getter/setter方法 实现序列化接口 下面我们将对Bean的创建、定位和使用进行详细讲解。 Bean的创建 JavaBean的创建需要满足上述特点,以…

    Java 2023年5月26日
    00
  • mybatis抽取基类BaseMapper增删改查的实现

    下面我将详细讲解如何使用mybatis抽取基类BaseMapper实现增删改查的完整攻略。 什么是BaseMapper 在使用MyBatis进行开发时,我们通常会对CRUD进行封装,然后在具体操作某个表时,通过继承该封装类来实现对该表的操作。但是,这样做的弊端就是复用性不高,每次都需要为每个表都写一遍操作代码,重复劳动十分麻烦。为了解决这个问题,我们可以自己…

    Java 2023年5月20日
    00
  • 源码分析SpringMvc日志打印被忽略输出问题

    源码分析SpringMvc日志打印被忽略输出问题 在 Spring MVC 中,我们可以使用日志打印来记录应用程序的运行情况。但是,有时候我们会发现日志打印被忽略输出,本文将详细讲解这个问题的原因和解决方法,并提供两个示例说明。 1. 原因分析 在 Spring MVC 中,日志打印是通过 Log4j、Logback 或者其他日志框架来实现的。如果日志打印被…

    Java 2023年5月18日
    00
  • Android实现与Apache Tomcat服务器数据交互(MySql数据库)

    接下来我将详细讲解“Android实现与Apache Tomcat服务器数据交互(MySql数据库)”的完整攻略。 1. 确定需要的框架和工具 在实现Android与Apache Tomcat服务器数据交互(MySql数据库)之前,你需要明确需要的框架和工具。例如: Android Studio:用于开发Android应用程序; Apache Tomcat:…

    Java 2023年5月19日
    00
  • java8新特性教程之time包使用总结

    Java8新特性教程之time包使用总结 Java8引入了java.time包,为Java的日期和时间处理提供了全新的API。新的API包括了很多改进和新增的功能,例如: 新的日期和时间API更加安全; 新的日期和时间API更加简单,提升了开发效率; 新的日期和时间API实现了时区处理,并且更加清晰易懂; 新的日期和时间API提供了可读性更强的代码。 Jav…

    Java 2023年5月20日
    00
  • Javaweb实现完整个人博客系统流程

    下面是“Javaweb实现完整个人博客系统流程”的完整攻略。 1. 前期准备 1.1 确定需求 在开发博客系统前,需要明确自己的需求方向,比如博客的主题、功能等。可以参考现有的博客系统,以此为基础进行需求收集和分析。 1.2 确定技术方案 开发博客,需要选择相应的技术方案,包括但不限于服务器、数据库、前端框架、后端框架等等。可以参考现有的博客系统,以此为基础…

    Java 2023年5月20日
    00
  • 详解Java中实现SHA1与MD5加密算法的基本方法

    当今网络环境中,安全性是非常重要的一个问题。密码的保护已经成为了一个必须面对的任务。SHA1和MD5是两种常见的加密算法,它们可以将密码字符串加密为一串看似随意的字符,从而实现密码的保护。在Java中,实现SHA1与MD5加密算法有以下基本方法: 1. 使用Java内置的MessageDigest类 MessageDigest是Java提供的安全类之一,它可…

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