Java实现文件上传服务器和客户端

下面从服务器和客户端两个角度,分别讲解Java实现文件上传的完整攻略。

一、服务器方案

1.1 前置准备

首先,我们需要引入Java的文件上传相关依赖包:commons-fileupload和commons-io。这两个包的作用是支持多种文件上传方式,并且后者还提供了一些方便的工具类来处理文件操作。

引入依赖参考pom.xml文件配置:

<dependencies>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
</dependencies>

1.2 服务器端代码实现

服务器端代码实现大致分成以下四个步骤:

  1. 创建Servlet,配置上传文件的相关参数:
@WebServlet("/upload")
@MultipartConfig(
    location = "/tmp", // 指定上传文件的目录
    maxFileSize = 1024 * 1024 * 10, // 最大文件上传大小
    maxRequestSize = 1024 * 1024 * 50, // 最大请求体大小
    fileSizeThreshold = 1024 * 1024, // 文件大小临界值(当文件大小超过这个值时,会写入磁盘)
)
public class UploadServlet extends HttpServlet {
    // ...
}
  1. 调用request.getPart()方法获取上传文件的part对象,然后使用InputStream获取文件流和part.getSubmittedFileName()获取文件名:
Part partFile = request.getPart("file");
String fileName = partFile.getSubmittedFileName();
InputStream inputStream = partFile.getInputStream();
  1. 使用Apache commons-io的FileUtils.copyInputStreamToFile()方法将inputStream中的文件流写入到目标文件:
File targetFile = new File(uploadPath, fileName);
FileUtils.copyInputStreamToFile(inputStream, targetFile);
  1. 处理上传过程中出现的异常或者错误,并返回上传结果:
response.setContentType("application/json;charset=UTF-8");
String json = "{\"message\":\"ok\"}";
response.getWriter().write(json);

1.3 示例

下面是一个基于SpringBoot的上传文件服务器的示例代码:

@RestController
public class FileController {
    @PostMapping(value="/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<Object> upload(@RequestParam("file") MultipartFile file) throws IOException {
        File targetFile = new File("/tmp/" + file.getOriginalFilename());
        file.transferTo(targetFile);
        return ResponseEntity.ok().build();
    }
}

二、客户端方案

2.1 前置准备

在客户端实现文件上传的过程中,我们需要使用Java的HttpURLConnection和BufferedReader类。具体来说,我们先构造HttpURLConnection对象,并设置相关的属性,比如请求的方式和请求头参数。然后,将要上传的文件读入内存中,然后构造一个OutputStream对象并将文件写入请求中。最后,处理服务器端的返回结果。

2.2 客户端代码实现

客户端上传文件通常分成以下三个步骤:

  1. 配置请求参数:
URL url = new URL("http://localhost:8080/upload");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
connection.setDoOutput(true);
  1. 构造表单数据:
OutputStream outputStream = connection.getOutputStream();
String formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s";
outputStream.write(String.format(formdataTemplate, "name", "testname").getBytes("utf-8"));
outputStream.write(String.format(formdataTemplate, "email", "testemail").getBytes("utf-8"));
outputStream.write(String.format(formdataTemplate, "file", file.getName()).getBytes("utf-8"));
  1. 上传文件并处理结果:
FileInputStream inputStream = new FileInputStream(file);
int bytesRead = -1;
byte[] buffer = new byte[4096];
while ((bytesRead = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, bytesRead);
}
outputStream.write("\r\n--".getBytes("utf-8"));
outputStream.write(boundary.getBytes("utf-8"));
outputStream.write("--\r\n".getBytes("utf-8"));

BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
String line = "";
while ((line = in.readLine()) != null) {
    System.out.println(line);
}

inputStream.close();
outputStream.flush();
outputStream.close();

2.3 示例

下面是一个基于Java URL的上传文件的客户端示例代码:

public class FileUploadTest {
    public static void main(String[] args) throws Exception {
        String boundary = UUID.randomUUID().toString();
        File file = new File("test.jpg");
        URL url = new URL("http://localhost:8080/upload");

        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        connection.setDoOutput(true);

        OutputStream outputStream = connection.getOutputStream();

        String formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s";
        outputStream.write(String.format(formdataTemplate, "name", "testname").getBytes("utf-8"));
        outputStream.write(String.format(formdataTemplate, "email", "testemail").getBytes("utf-8"));
        outputStream.write(String.format(formdataTemplate, "file", file.getName()).getBytes("utf-8"));

        FileInputStream inputStream = new FileInputStream(file);
        int bytesRead = -1;
        byte[] buffer = new byte[4096];
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.write("\r\n--".getBytes("utf-8"));
        outputStream.write(boundary.getBytes("utf-8"));
        outputStream.write("--\r\n".getBytes("utf-8"));
        inputStream.close();

        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
        String line = "";
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }

        outputStream.flush();
        outputStream.close();
    }
}

这篇文章介绍了常见的文件上传操作。在实际开发中,我们可以根据业务需求进行修改和扩展。在此基础上,还可以加入安全认证和限流等措施加强上传文件的安全性和稳定性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现文件上传服务器和客户端 - Python技术站

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

相关文章

  • Spring Boot JDBC 连接数据库示例

    介绍一下”Spring Boot JDBC 连接数据库示例”的完整攻略。 1. 环境准备 首先,我们需要准备JDK和Maven环境。确保已安装JDK环境,可以在命令行终端中输入以下命令进行验证: java -version 验证通过后,下载和安装Maven。同样在终端中输入以下命令进行验证: mvn -v 验证通过后,环境准备工作就做完了。 2. 添加依赖 …

    Java 2023年5月19日
    00
  • Spring Boot 通过 Mvc 扩展方便进行货币单位转换的代码详解

    接下来我将详细讲解“Spring Boot 通过 Mvc 扩展方便进行货币单位转换的代码详解”的完整攻略,过程中将包含两条示例。 一、背景介绍 在开发过程中,我们经常需要进行货币单位转换。如美元和人民币之间的转换等。本文将通过 Spring Boot 中的 Mvc 扩展来实现货币单位转换。 二、技术准备 在进行具体实现之前,我们需要准备以下技术: 1. Sp…

    Java 2023年5月20日
    00
  • Java如何定义Long类型

    Java 中的 Long 类型表示的是一个 64 位的有符号整数,其取值范围为 -2^63 到 2^63-1。 在 Java 中定义 Long 类型可以使用以下两种方式: 1. 直接使用 long 类型的字面量 可以直接定义一个 long 类型的变量,使用 L 或者小写 l 后缀来确保该变量是 Long 类型: long maxValue = 9223372…

    Java 2023年5月26日
    00
  • 浅谈Java实现回溯算法之八皇后问题

    浅谈Java实现回溯算法之八皇后问题 什么是八皇后问题? 八皇后问题是一个经典的问题,在一个8×8的棋盘上放置8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。也就是说,每个皇后所在的行、列、对角线都必须存在且只能存在一个皇后。 回溯算法 回溯算法是一种有组织地遍历所有可能的情况的搜索算法。它从一条路径开始,尝试不同的选择,直到找到符合条件的解…

    Java 2023年5月19日
    00
  • Mybatis下动态sql中##和$$的区别讲解

    针对”Mybatis下动态sql中##和$$的区别讲解”这个问题,下面是完整的攻略: 1. ##和$$的基本区别 1.1 ##和$$分别代表什么 Mybatis中的#{}和${}都是用来表示动态sql的。其中,#{}叫做“预编译”。#{}可以防止SQL注入攻击,是使用Mybatis的推荐方式。 在#{}中使用的参数会被自动进行占位符处理,不需要手动添加占位符…

    Java 2023年5月19日
    00
  • 并发集合的作用是什么?

    并发集合是多线程编程中常见的数据结构,它可以解决多线程并发访问数据时的安全性问题,实现数据的共享与同步。下面是并发集合的作用和使用攻略的详细讲解。 并发集合的作用: 线程安全:并发集合能够保证多线程并发访问时的数据安全性,避免了多线程下数据出现冲突的情况。 高效性:并发集合能够提高多线程程序的运行效率,同时可以减少线程切换的次数,提高程序的吞吐量和响应能力。…

    Java 2023年5月10日
    00
  • mybatis开启spring事务代码解析

    在使用MyBatis操作数据库时,我们可以使用Spring事务管理器来管理事务。在本文中,我们将详细介绍如何在MyBatis中开启Spring事务,并提供两个示例说明。 1. 配置数据源 在使用MyBatis操作数据库时,我们需要配置数据源。下面是一个示例配置文件: <bean id="dataSource" class=&quot…

    Java 2023年5月18日
    00
  • SpringBoot利用AOP实现一个日志管理详解

    来讲一下SpringBoot利用AOP实现一个日志管理的详细攻略。 一、前置知识 在讲解具体实现之前,需要对一些前置知识进行解释: 1.1 AOP AOP(Aspect Oriented Programming,面向切面编程)是一种编程思想,可以将与业务无关的部分(例如日志记录、权限验证等)剥离出来,通过以独立的方式进行定义和维护,将其在需要时运用进程序设计…

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