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

yizhihongxing

下面从服务器和客户端两个角度,分别讲解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日

相关文章

  • 关于Java的对象序列化流和反序列化流详细解读

    关于Java的对象序列化流和反序列化流详细解读 什么是对象序列化? 在Java中,对象序列化是指将一个对象转换为字节序列的过程,该字节序列可以被存储于磁盘上,或者将其传递到另一个网络节点中。对象序列化主要用于数据持久化或者网络传输。 如何进行对象序列化? Java提供了ObjectOutputStream类,它可以将Java对象转换为字节流。下面是一个对象序…

    Java 2023年5月26日
    00
  • JavaWeb文件上传开发实例

    JavaWeb文件上传开发实例 在JavaWeb开发中,文件上传是一个常见的功能。本篇文章将为大家介绍如何在JavaWeb项目中实现文件上传的功能。 1. 前置条件 在开发文件上传功能前,需要先了解JavaWeb中FileUpload组件。FileUpload组件是Apache提供的一个工具包,用于在Web应用中处理文件上传功能。我们需要从官方网站上下载Fi…

    Java 2023年5月19日
    00
  • Java9新特性Module模块化编程示例演绎

    Java9新特性Module模块化编程示例演绎攻略 什么是模块化编程 在Java9之前,我们编写的Java应用程序都是基于jar包的。当我们开发大型应用时,常常面临着依赖管理不可控、类冲突等问题。而Java9引入了一种新的编程方式——模块化编程。在模块化编程中,我们可以将应用程序拆分成多个独立的模块,并对每个模块进行依赖管理。这种方式能够让应用程序更加灵活、…

    Java 2023年5月26日
    00
  • 详解servlet调用的几种简单方式总结

    接下来我会详细讲解“详解servlet调用的几种简单方式总结”的完整攻略。 一、概述 在Java Web开发中,Servlet是一个非常重要的组件。在使用Servlet时,我们需要调用Servlet,以便它可以响应客户端的请求。本文将简要介绍Servlet的使用,并总结几种简单的调用方式。 二、Servlet的使用示例 首先我们需要新建一个Servlet,下…

    Java 2023年6月15日
    00
  • JAVA annotation入门基础

    JAVA annotation入门基础 什么是Annotation? Annotation 是Java5.0引入的注解机制,它提供了一种注释程序的方法,这些注释可以在编译期,类加载期或者运行期被读取和处理。Annotation 可以看作是程序中的元数据,它提供数据给程序员,让程序员在编写程序时能够更加充分地利用Java语言的特性。Annotation 是Ja…

    Java 2023年5月26日
    00
  • Java结构型模式之门面模式详解

    Java结构型模式之门面模式详解 什么是门面模式? 门面模式是一种结构型设计模式,它提供了一个简化系统子系统的接口,可以将复杂的子系统封装起来,使得客户端可以更方便地使用。 为什么需要使用门面模式? 在复杂的软件系统中,有时我们需要通过多个子系统协作来完成某个功能,而这些子系统之间的联系往往比较复杂。如果我们直接调用子系统中的方法,那么代码将会变得非常复杂,…

    Java 2023年6月2日
    00
  • java实现把对象数组通过excel方式导出的功能

    要实现将Java对象数组导出成Excel文档,我们可以借助Apache POI库。下面是具体的攻略: 1. 引入POI依赖 首先需要在项目中引入POI依赖。可以使用Maven或Gradle构建工具,将以下依赖添加到项目中: <dependency> <groupId>org.apache.poi</groupId> &lt…

    Java 2023年5月20日
    00
  • Java实现简单通讯录管理系统

    Java实现简单通讯录管理系统的完整攻略包含以下步骤: 1. 需求分析 首先要了解用户的需求,确定要开发哪些功能并对其进行分析及设计。通讯录管理系统需要实现的功能如下: 添加联系人 查询联系人 修改联系人 删除联系人 显示所有联系人 2. 数据存储 数据存储是通讯录管理系统的核心,因此需要确定使用哪种方式来存储联系人信息。可以选择文件存储、数据库存储或者内存…

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