Java客户端服务端上传接收文件实现详解

Java客户端服务端上传接收文件实现详解

本文针对Java客户端与服务端之间的文件上传与接收过程进行详细讲解,包括服务端搭建、客户端实现、文件上传与接收等方面。

服务端搭建

服务端主要负责接收文件并进行处理。以下是搭建服务端的步骤:

  1. 创建一个Java项目
  2. 引入spring-boot-starter-web依赖(以Spring Boot为例)
  3. 创建文件上传接口,以@PostMapping注解的方式实现文件接收
  4. 在文件上传接口中,使用MultipartFile对象获取上传文件的相关信息,如文件名、大小等。

以下是示例代码:

@RestController
public class FileController {

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
        String filename = file.getOriginalFilename();
        System.out.println("接收到文件:" + filename);
        // 文件保存操作
        file.transferTo(new File("D:/upload/" + filename));
        return "文件上传成功!";
    }
}

在上述代码中,@RequestParam注解中的file表示上传文件在表单中的name属性,通过MultipartFile对象获取上传文件的相关信息。之后将文件保存到指定的存储路径。

客户端实现

客户端主要负责将本地文件发送至服务端。以下是客户端实现的步骤:

  1. 引入spring-boot-starter-web依赖(以Spring Boot为例)
  2. 创建RestTemplate对象
  3. 创建一个MultiValueMap对象,并将需要上传的文件以ByteArrayResource类型的方式添加到其中
  4. 构造一个HttpHeaders对象,设置请求头
  5. 执行POST请求,并将MultiValueMapHttpHeaders对象作为请求体参数

以下是示例代码:

public class FileUploadClient {

    public static void main(String[] args) throws IOException {
        // URL
        String url = "http://localhost:8080/upload";
        // 文件路径
        String filepath = "D:/upload/test.txt";

        RestTemplate restTemplate = new RestTemplate();
        FileSystemResource fileResource = new FileSystemResource(filepath);

        MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
        param.add("file", fileResource);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(param, headers);

        ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
        System.out.println(response.getBody());
    }
}

在上述代码中,使用RestTemplate对象执行POST请求,并将文件以ByteArrayResource类型的方式添加到MultiValueMap对象中。可以通过设置HttpHeaders对象的Content-Type属性为MULTIPART_FORM_DATA来设置请求头,最后将MultiValueMapHttpHeaders对象作为请求体参数进行POST请求。

文件上传与接收

通过上述服务端与客户端的实现,可以实现文件的上传与接收。客户端将本地文件以POST方式上传到服务端,服务端接收后进行相应处理。

以下是文件上传与接收的示例代码:

public class FileUploadClient {

    public static void main(String[] args) throws IOException {
        // URL
        String url = "http://localhost:8080/upload";
        // 文件路径
        String filepath = "D:/upload/test.txt";

        RestTemplate restTemplate = new RestTemplate();
        FileSystemResource fileResource = new FileSystemResource(filepath);

        MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
        param.add("file", fileResource);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(param, headers);

        ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
        System.out.println(response.getBody());
    }
}

@RestController
public class FileController {

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
        String filename = file.getOriginalFilename();
        System.out.println("接收到文件:" + filename);
        // 文件保存操作
        file.transferTo(new File("D:/upload/" + filename));
        return "文件上传成功!";
    }
}

上述示例代码中,客户端将本地D:/upload/test.txt文件上传到服务端的/upload路径中,服务端接收到文件后将其保存至D:/upload/目录下。

另外一个示例,可以参考以下的代码:

public class FileUploadClient {

    private static final int BUFFER_SIZE = 1024;

    public static void main(String[] args) throws IOException {

        String filepath = "D:/upload/test.txt";
        String url = "http://localhost:8080/upload";

        HttpClient httpclient = HttpClients.createDefault();
        HttpPost httppost = new HttpPost(url);

        File file = new File(filepath);

        FileEntity entity = new FileEntity(file);
        entity.setContentType("multipart/form-data");

        httppost.setEntity(entity);

        HttpResponse response = httpclient.execute(httppost);
        HttpEntity responseEntity = response.getEntity();
        System.out.println(EntityUtils.toString(responseEntity));
    }
}

@RestController
public class FileController {

    @PostMapping("/upload")
    public String upload(HttpServletRequest request) throws Exception {
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);

        if (isMultipart) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);

            List<FileItem> items = upload.parseRequest(request);
            Iterator<FileItem> iterator = items.iterator();

            while (iterator.hasNext()) {
                FileItem item = iterator.next();

                if (!item.isFormField()) {
                    String fileName = StringUtils.cleanPath(item.getName());
                    String uploadPath = "D:/upload/";
                    Path path = Paths.get(uploadPath + fileName);
                    Files.copy(item.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
                    return "文件上传成功!";
                }
            }
        }

        return "文件上传失败!";
    }
}

在上述示例代码中,客户端通过HttpClient对象执行POST请求,并将文件以FileEntity类型的方式添加到请求体中。服务端利用Apache Commons FileUpload工具处理请求中的文件,并保存至指定目录下。

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

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

相关文章

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

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

    Java 2023年5月10日
    00
  • 详解Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat

    详解Java时区处理之Date, Calendar, TimeZone, SimpleDateFormat Java中有多种处理日期时间和时区的类,包括Date、Calendar、TimeZone、SimpleDateFormat等。了解这些类的使用方法以及它们之间的区别非常重要。下面我们对这些类逐一进行了解。 Date类 Date是Java中表示日期时间的…

    Java 2023年5月20日
    00
  • 教你用Java SpringBoot如何解决跨域

    教你用 Java Spring Boot 如何解决跨域 在本文中,我们将详细讲解如何使用 Java Spring Boot 解决跨域问题。我们将使用 Spring Boot 2.5.0 版本的源码进行分析。 什么是跨域? 跨域是指在浏览器中,当一个 Web 应用程序试图访问另一个域名下的资源时,浏览器会阻止这种行为。这是由于浏览器的同源策略所导致的。同源策略…

    Java 2023年5月15日
    00
  • java中实体类转Json的2种方法

    下面来详细讲解Java中实体类转JSON的2种方法的攻略。 1. 使用Gson库进行实体类转JSON Gson是Google开发的可以用来将Java对象转换成JSON字符串,也可以将JSON字符串转换成Java对象的库。下面是一个使用Gson库进行转换的示例代码: import com.google.gson.Gson; public class Perso…

    Java 2023年5月20日
    00
  • 关于RestTemplate的使用深度解析

    关于RestTemplate的使用深度解析 RestTemplate是一个常用的HTTP客户端,它提供了简单的API,可以用来发送HTTP请求并获取响应结果。RestTemplate的使用非常广泛,可以用来调用RESTful API,发送表单数据,获取JSON数据等等。在本篇攻略中,我们将深入探讨RestTemplate的使用。 1. RestTemplat…

    Java 2023年5月20日
    00
  • 一文让你了解透彻Java中的IO模型

    一文让你了解透彻Java中的IO模型 IO模型简介 在计算机中,IO模型是处理输入输出数据流的方法。在Java中,提供了多种IO模型,包括BIO、NIO、AIO。 BIO: 同步阻塞IO,采用传统的输入输出流,每一个线程并发处理一个客户端的请求。 NIO: 同步非阻塞IO,采用通道和缓冲区的概念,可以用一个线程并发处理多个客户端的请求。 AIO: 异步非阻塞…

    Java 2023年5月26日
    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
  • 如何编写Java单元测试?

    当我们编写Java代码时,单元测试是非常重要的一部分。它可以帮助我们在开发过程中就确定代码是否正确,而不必等到部署到实际环境中才发现问题。本篇文章将会给出针对Java代码的单元测试的完整攻略。 步骤一:选择合适的单元测试框架 在Java中,有很多单元测试框架可供选择,包括JUnit、TestNG、Spock等。其中,JUnit是最常用的框架之一。本文将以JU…

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